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 <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)个。
0则评论给“fork函数”