buhuiyaolian 2017-03-09 02:10 采纳率: 25%
浏览 861
已结题

linux系统函数fork的疑问

 #include<sys/types.h>
 #include<unistd.h>                                                          
 #include<stdio.h>
 #include<stdlib.h>
 int main(void)
 {

    printf("origin is %d\n",getpid());
     printf("origin p is %d\n",getppid());

     pid_t pid;
     pid=fork();
     if(pid>0)
      {
         printf("parent is %d\n",getpid());
      }
     else if(pid==0)
    {

         printf("child is %d\n",getpid());
         printf("child's parent is %d\n",getppid());
    }
 }

图片说明

运行结果显示,调用getppid之后,child的父进程PID号和它的父进程不同(
父3973,子中的父1224),但是更改代码,只要加入一个可以让程序阻塞的代码,就正确,在上述代码最后加个while 1,代码和运行结果如下:

  #include<sys/types.h>
 #include<unistd.h>                                                          
 #include<stdio.h>
 #include<stdlib.h>
 int main(void)
 {

    printf("origin is %d\n",getpid());
     printf("origin p is %d\n",getppid());

     pid_t pid;
     pid=fork();
     if(pid>0)
      {
         printf("parent is %d\n",getpid());
      }
     else if(pid==0)
    {

         printf("child is %d\n",getpid());
         printf("child's parent is %d\n",getppid());
    }
    while(1)
        ;
 }

图片说明

说明,可执行文件是app,在app进程中的origin p 进程PID号是bash的2071,但是为什么在不阻塞的情况下,在child进程中调用getppid函数得到的PID号与父进程不匹配,而在阻塞的情况下就正确,不管加while循环还是scanf得到的都正确。求解啊

  • 写回答

3条回答 默认 最新

  • 呆的久 2017-03-09 02:42
    关注

    不加阻塞,父进程继续执行main,执行完就销毁了啊.
    此时你在子进程调用getppid,当然找不到原来的父进程.

    加了阻塞,父进程一直在那里等,系统不会回收父进程,所以子进程能获得原来的父进程

    评论

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码