进行两次fork,会产生几个进程,他们的ID是多少,本文通过实例进行分析。
基本概念:
pid_t:
pid_t是typedef定义的类型,表示进程的id。
在sys/types.h中定义:typedef short pid_t;
所以说pid_t就是一个short类型的变量,实际表示的是内核中进程表的索引。
pid_t getpid(void);
返回目前进程的ID。
pid_t fork(void);
分叉函数。返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1。
子进程将获得父进程数据空间、堆、栈等资源的副本,父子进程间不共享这些存储空间。
写时拷贝是fork后来采用的优化技术,这样,对于fork后并不是马上拷贝内存,而是只有你在需要改变的时候,才会从父进程中拷贝到子进程中,这样fork后立马执行exec的成本就非常小了。
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
int main()
{
pid_t pid = fork();
if(pid < 0)
perror("first fork\n");
else if(pid > 0)
{
printf("父进程ID:%d\n",getpid());
printf("子进程ID:%d\n",pid);
}
else
{
pid_t _pid = fork();
if(_pid < 0)
perror("second fork\n");
else if(_pid > 0)
{
printf("子进程ID:%d\n",getpid());
printf("孙进程ID:%d\n",_pid);
}
else
printf("孙进程ID:%d\n",getpid());
}
exit(0);
}
结果如下:
父进程ID:4670
子进程ID:4671
子进程ID:4671
孙进程ID:4672
孙进程ID:4672
图示:
1,2行结果是由11、12行代码产生的
3,4行结果是由21、22行代码产生的
5行结果是由25行代码产生的