fork()函数
Tag fork,进程, on by view 3256

fork函数可以复制一个当前进程。看代码

#include <stdio.h>
int main(void){
    int pid;
    pid=fork();
    if(pid>0){//在父进程
        printf("Parents Process, The son pid: %d\n", pid);
    }else if(0==pid){//在子进程
        printf("Son Process, The pid return: %d\n", pid);
    }else{
        printf("Error!\n");
    };
    for(;1;){
        sleep(1);
    }
    return 0;
}

为了让程序不会运行结束自动退出我使用for死循环和sleep函数将程序阻塞,fork函数会创建一个进程,至於是否创建了进程我们看任务管理器的截图

t1.png

任务管理器中有两个相同名称的进程了,这说明进程创建成功。 看终端运行结果
 t2.png

结果表明程序成功的创建了一个新进程。 fork()函数可以创建一个新进程并且返回子进程的ID,子进程与父进程完全一样,即执行相同的代码可是当子进程执行到fork()函数处的时候返回的值为0,却没有再创建进程;而父进程执行到fork()处创建了这个子进程并且返回了子进程的ID,至於为什么子进程不继续创建子子进程,这个我暂时就不知道了。 后来我又到fork()函数之前添加了一个printf作为标识,代码如下

#include <stdio.h>
int main(void){
    int pid;
    printf("hello\n";);
    pid=fork();
    if(pid>0){//在父进程
        printf("Parents Process, The son pid: %d\n", pid);
    }else if(0==pid){//在子进程
        printf("Son Process, The pid return: %d\n", pid);
    }else{
        printf("Error!\n");
    };
    for(;1;){
        sleep(1);
    }
    return 0;
}

运行,终端截图

t3.png

图中并没有两行hello,这说明,如果子进程是完全复制父进程从代码的第一行开始执行的话子进程也会打印hello,很明显子进程不是这样干的。 再改代码,在fork函数之后添加printf,为了避开if分支就把printf函数添加到for阻塞代码的前一行[14],代码如下

#include <stdio.h>
int main(void){
    int pid;
    printf("hello\n");
    pid=fork();
    if(pid>0){//在父进程
        printf("Parents Process, The son pid: %d\n", pid);
    }else if(0==pid){//在子进程
        printf("Son Process, The pid return: %d\n", pid);
    }else{
        printf("Error!\n");
    };
    printf("world\n");
    for(;1;){
        sleep(1);
    }
    return 0;
}

运行截图

t4.png

是的,结果如我所料,有两个world,这说明fork后的进程并不是从头开始执行的,而是从fork语句处开始执行的。这不就是在fork函数那个点产生了一个分支吗。对于长期在github里面混的我,这让我想起了github项目管理里面的fork,看样子他们的表达是一样的,github的fork截图

t5.png

你理解了fork吗?反正我是懂了……