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