简介
调用fork()函数会生成一份当前进程的副本。调用fork()的进程为父进程,副本进程为子进程。子进程共享父进程的代码段,并拥有与父进程数据段,堆和栈的副本(与父进程内容相同但空间独立)。
现在系统中应用了写复制机制(Copy-On-Write),调用fork后子进程并没有生成独立的空间,仍然共享父进程资源,只有当子进程尝试修改数据段或堆栈时才会分配新的空间。这样大大提高了fork的效率。
函数原型
#include <unistd.h>
pid_t fork(void);
描述
创建一个子进程,这个子进程为当前进程的副本。
返回值
成功时在父进程中返回子进程的pid,子进程中返回0。
失败时在父进程中返回-1,无子进程。
实例
#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
int var = ;
pid = fork();
if(pid == ) {
var++;
printf("I'm child process, pid:[%d], var:%d\n", getpid(), var);
} else if(pid > ) {
sleep(); /* 保证父进程在子进程后退出,便于观察var变量的独立性. */
printf("I'm parent process, pid:[%d], var:%d\n", getpid(), var);
} else {
printf("fork error\n");
}
return ;
}
运行结果:
$ ./a.out
I'm child process, pid:[], var:
I'm parent process, pid:[], var: