一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。fork执行时,是把进程当前的情况拷贝一份,只拷贝下一个要执行的代码到新的进程。
fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
看如下示例:
int main(void) { pid_t pid = 0; pid = fork(); /* suppose child process pid is 1111 */ pid = fork(); /* suppose child process pid is 2222 */ printf(“pid = %d\n”, pid); return 0; }
|
第一个fork()执行结果分析如下:
fork_1 | |||
stat | ppid | cur_pid | return |
parent | ?? | 1110 | 1111 |
children | 1110 | 1111 | 0 |
主进程1110生成一个pid为1111的子进程
第二个fork()执行结果分析如下:
| fork_2 | ||
stat | ppid | cur_pid | return |
parent | ?? | 1110 | 2222 |
parent | 1110 | 1111 | 2223 |
children | 1110 | 2222 | 0 |
children | 1111 | 2223 | 0 |
主进程1110生成pid为2222的子进程,主进程1111生成pid为2223的子进程
故最终可能的执行结果为:
pid = 2222 pid = 0 pid = 2223 pid = 0 |
参考资料: