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,当然找不到原来的父进程.

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

    评论

报告相同问题?

悬赏问题

  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站