父进程与子进程之间的关系十分复杂,最大的复杂点在于进程间相互调用。Linux下这一流程称为fork-and-exec。父进程通过fork的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要进行的进程,最终成为一个子进程的存在。整个流程如下

进程控制——fork-and-exec、system、wait

API解释

fork

原型

#include <unistd.h>
pid_t fork(void);

功能

从调用该函数的进程复制出子进程,被复制的进程则被称为父进程,复制出来的进程称为子进程。

复制后有两个结果:

1)依照父进程内存空间样子,原样复制地开辟出子进程的内存空间

2)由于子进程的空间是原样复制的父进程空间,因此子进程内存空间中的代码和数据和父进程完全相同

其实复制父进程的主要目的,就是为了复制出一块内存空间,只不过复制的附带效果是,子进程原样的拷贝了一份其实复制父进程的主要目的,就是为了复制出一块内存空间,只不过复制的附带效果是,子进程原样的拷贝了一份

参数

返回值

由于子进程原样复制了父进程的代码,因此父子进程都会执行fork函数,当然这个说法有些欠妥,但是暂且这么理解。

1)父进程的fork,成功返回子进程的PID,失败返回-1,errno被设置。

2)子进程的fork,成功返回0,失败返回-1,errno被设置。

代码演示

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <sys/types.h>
 4 #include <unistd.h>
 5 
 6 int main(void)
 7 {
 8     pid_t ret = 0;
 9     
10 
11     printf("befor fork\n");
12 
13     ret = fork();
14     if(ret > 0)
15     {
16         printf("parent PID = %d\n", getpid());
17         printf("parent ret = %d\n", ret);
18         sleep(1);
19     }
20     else if(ret == 0)
21     {
22         printf("child PID = %d\n", getpid());
23         printf("child ret = %d\n", ret);
24     }
25     
26     printf("after fork\n\n");
27 
28 //    while(1);
29     return 0;
30 }
View Code

相关文章: