2013-12-19 86 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()同步原語(但可以很方便簡單的東西)

相關問題