fork函数

 1、fork入门

计算机程序设计中的分叉函数。返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程标记;否则,出错返回-1。

fork函数将运行着的程序分成2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程。这两个进程中的线程继续执行,就像是两个用户同时启动了

该应用程序的两个副本。

需要注意的是:(1)当调用fork()函数时,在该位置进程一分为二,一个是父进程,一个是子进程。(2)若调用成功返回的是两个值,父进程返回的值为子进程标志,子进程返回的值为0,不成功返回为-1。

为什么成功调用会返回两个值?由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

 每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。

子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。下面看一个简单的例子:

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

int main()
{
    pid_t pid = fork();
    if(pid < 0)
        printf("error");
    else if(pid == 0)
        printf("this is child\n");
    else
        printf("this is parent\n");
    return 0;
}

输出:this is parent

              this is child

至于父进程和子进程哪个先执行,这和操作系统和调度算法有关,其实这个问题在实际应用中并不重要。

 2、fork进阶

看一下一个例子。

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

int main()
{
    int i = 0;
    for(i = 0; i < 3; i++)
    {
        fork();
        printf("hello world\n");
    }
    return 0;
}

运行的时候一共输出14个hello world。

   当i = 0的时候,一共2个进程,输出2个hello world, 当i=1时,2个进程变成4个,这时输出4个hello world,当i=2时,4个进程变成8个,这时输出8个hello world,一共输出2+4+8=14个hello world。当循环n次时,就输出2(1 + 2 + 2n-1)个。

原文链接: fork函数 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙团 ( https://gyarmy.com/post-472.html )