fork建立进程

系统调用 fork()是建立进程的最基本操作,它是把 Linux 变换为多任务系统的基础。fork()在 Linux 系统库 unistd.h 中的函数声明如下:

 

pid_t fork(void);

 

如果 fork()调用成功,就会使内核建立一个新的进程,所建的新进程是调用 fork()的进程的副本。也就是说,新的进程运行与其创建者一样的程序,其中的变量具有与创建进程那变量相同的值。

 

新建立的进程被成为子进程(child process),那个调用 fork()建立此新进程的进程被称为父进程(parent process)。以后,父进程与子进程就并发执行,它们都从 fork()调用后的那句语句开始执行。

#include <stdio.h>
#include <unistd.h>

int main(void)
{

        pid_t pid;

        printf("one process\n");

        pid = fork();
        if(!pid)
                printf("child\n");
        else if(pid>0)
                printf("child pid=%d\n",pid);
        else
                printf("fail\n");
        return 0;

}

fork 调用后面的条件语句有三个分支:第一个分支对应于 pid 的值为零,它给出了子进程的工作;第二个分支对应于 pid 之值为正数,它给出了父进程的工作。第三个分支对应于 pid 之值为负数(实际为-1),它给出了 fork 建立子进程失败时所作的工作。当系统那进程总数已达到系统规定的最大数,或者是用户可建立的进程数已达到系统规定的最大数时,这时再调用 fork,则会导致失败,并在 errno 中含有出错代码 EAGAIN。我们还应该注意到。上述两个进程间没有同步措施,所以父进程和子进程的输出内容有可能会叠加在一起。