两次fork产生进程ID分析

进行两次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的成本就非常小了。

扫描二维码关注公众号,回复: 956431 查看本文章
 
 
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <stdlib.h>
  4. int main()
  5. {
  6.     pid_t pid = fork();
  7.     if(pid < 0)
  8. perror("first fork\n");
  9.     else if(pid > 0)
  10.     {
  11. printf("父进程ID:%d\n",getpid());
  12. printf("子进程ID:%d\n",pid);
  13.     }
  14.     else
  15.     {
  16. pid_t _pid = fork();
  17. if(_pid < 0)
  18.          perror("second fork\n");
  19. else if(_pid > 0)
  20. {
  21.     printf("子进程ID:%d\n",getpid());
  22.     printf("孙进程ID:%d\n",_pid);
  23. }
  24. else
  25.     printf("孙进程ID:%d\n",getpid());
  26.     }
  27.     exit(0);
  28. }

结果如下:

父进程ID:4670
子进程ID:4671
子进程ID:4671
孙进程ID:4672
孙进程ID:4672

图示:


1,2行结果是由11、12行代码产生的

3,4行结果是由21、22行代码产生的

5行结果是由25行代码产生的








猜你喜欢

转载自blog.csdn.net/znzxc/article/details/80288965
今日推荐