我需要父进程比子进程更早地结束。这是代码:
#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。我很抱歉我的英语
发布于 2013-12-19 17:07:14
看起来,您的父进程甚至在孩子开始睡觉之前就退出了。这是可能的,因为您的父母在创建孩子之后不会做任何花费大量时间的事情。它只是打印和退出。所以孩子在睡觉前就看到了PPID 1。
如果在父程序的末尾添加一个sleep(1),那么子程序打印两个不同的PPID的可能性要大得多。
如果这样做不起作用,那么您必须执行一些实际的同步操作,才能让您的进程按照正确的顺序运行这些步骤。睡眠对此并不好,因为您无法控制其他东西所花费的时间(包括您的进程根本没有运行的时间,因为其他东西占用了CPU)。
发布于 2013-12-19 16:50:52
输出看上去很好。父进程似乎正在退出;子进程不受父进程死亡的影响,并继续打印其输出。
您可以看到,当父进程退出时,其父进程的父级发生了变化;孤儿由进程ID 1继承,进程ID 1只是坐在那里等待孩子死亡。PID 1在传统上是init进程(例如,在Mac上,它是/sbin/launchd)。
发布于 2013-12-19 17:15:13
也许你似乎缺少的是两个进程之间的某种形式的同步,例如通过信号、管道等。你来选择
为确保执行顺序:
fork()之后的父级打印它的内容,告诉孩子醒来后立即退出sleep()是,而不是,它是一个同步原语(但对于简单的东西来说却很方便)
https://stackoverflow.com/questions/20686307
复制相似问题