#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什么鬼。