2013-12-19 56 views
1

我需要父进程比子进程更早结束。 这是代码:如何在孩子完成之前杀死父母的过程?

#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

欢迎堆栈溢出。请尽快阅读[关于]页面。你的英语完全可以理解。我会写“我需要父进程比孩子进程更早结束”。 –

+0

后续问题是为什么你需要父母更快结束。如果仅仅是为了基本的测试目的,你可以简单地在孩子身上放一个足够长的“睡眠”并离开父母。或者你是否需要一个更持久的解决方案来解决真正的问题?如果是这样,你应该解释是什么问题。 – Duck

+0

@Duck:有很多原因希望子进程超出父进程,尤其是当父进程启动后台或守护进程时。 –

回答

1

看起来你的父进程在孩子开始睡觉之前退出。这是可能的,因为您的父母在创建孩子后不会做任何需要大量时间的事情。它只是打印和退出。所以孩子甚至在睡觉之前就看到了PPID 1。

如果您将父母的末尾添加sleep(1),则孩子将会有更好的机会打印2个不同的PPID。

如果这不起作用,您将不得不做一些实际的同步来让您的进程以正确的顺序运行这些步骤。睡觉并不好,因为你无法控制东西需要花费多少时间(包括因为别的东西拿走了CPU而导致你的进程完全没有运行的时间)。

1

输出看起来很好。父母程序似乎正在退出;子进程不受父母死亡的影响,并继续打印其输出。

您可以看到,父母退出时孩子的父母发生了变化;孤儿是由进程ID 1继承的,它只是坐在那里等着孩子们死去。 PID 1通常是init进程(尽管在Mac OS X上,例如,它是/sbin/launchd)。

1

也许你似乎缺乏的是某种形式的,可以通过信号,管道等要来达到的,例如两个进程之间的同步......你选择

为了保证执行的顺序:

  • 父后fork()打印的东西,告诉孩子醒来 和退出
  • immeditly后的孩子等待它唤醒之前,然后打印在轮到他自己的东西。

sleep()同步原语(但可以很方便简单的东西)

相关问题