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得到的都正确。求解啊

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

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

在parent分支的print后加 wait();
#否则 parent 会 terminate

如果不回收的话是不确定它们哪个先执行完!子进程先于父进程退出,应该属于正常情况。
若父进程先退出 子进程为孤儿进程,应该由init进程接管呀。应该是1的 我还试了一下,确实是1
不知道你的1224什么鬼。