进行两次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行代码产生的