我需要父进程先前结束而不是子进程。 这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
main()
{
extern int errno;
extern char* sys_errlist[];
pid_t pid;
int rv;
switch(pid=fork()) {
case -1:
perror("fork");
exit(1);
case 0:
printf(" CHILD: This is child-process!\n");
printf(" CHILD: My PID -- %d\n", getpid());
printf(" CHILD: My parent PID -- %d\n", getppid());
sleep(3);
printf(" CHILD: My new parent PID -- %d\n", getppid());//I think, that getppid() return 1
printf(" CHILD: Exit!\n");
exit(rv);
default:
printf("PARENT: This is parent-process!\n");
printf("PARENT: My PID -- %d\n", getpid());
printf("PARENT: My child PID %d\n",pid);
printf("PARENT: Exit!\n");
}
}
但我不确定它是否正确。 该程序的输出:
PARENT: This is parent-process!
PARENT: My PID -- 943
PARENT: My PID -- 943
PARENT: My child PID -- 944
PARENT: Exit!
CHILD: This is child-process!
CHILD: My PID -- 944
CHILD: My parent PID -- 1
CHILD: My new parent PID -- 1
CHILD: Exit!
谢谢! PS。对不起我的英文
答案 0 :(得分:1)
输出看起来很好。父流程似乎正在退出;子进程不受父级死亡的影响,并继续打印其输出。
当父母退出时,您可以看到孩子的父母已经改变;孤儿是由进程ID 1继承的,它只是坐在那里等待孩子们死去。 PID 1通常是init
进程(例如,在Mac OS X上,它是/sbin/launchd
)。
答案 1 :(得分:1)
看起来你的父进程在孩子开始睡觉之前退出了。这是可能的,因为您的父母在创建孩子后不会花费大量时间。它只是打印和退出。所以孩子甚至在睡觉前就看到了PPID 1。
如果您在父母的末尾添加sleep(1)
,孩子将有更好的机会打印2个不同的PPID。
如果这不起作用,您将必须进行一些实际的同步,以使您的流程按正确的顺序运行步骤。睡眠并不是很好,因为你无法控制其他东西需要多长时间(包括你的进程根本没有运行的时间,因为其他东西占用了CPU)。
答案 2 :(得分:1)
也许您似乎缺少的是两个进程之间的某种形式的同步,例如可以通过信号,管道等实现...您选择
确保执行顺序:
fork()
打印其内容后,告诉孩子醒来
sleep()
不是同步原语(但对于简单的东西可以很方便)