2017-02-28 42 views
0

我運行Debian的Linux我的C計劃,該計劃預計將輸出在C,LINUX,約殺死並提高

$ ./kill_raise 
Child(pid : 4877) is waiting for any signal 
Parent kill 4877 

,但我剛剛

父殺4877

子進程中的字符串(Child(pid:%d)正在等待任何信號)未打印出來,爲什麼?

,這是我的程序

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 


int main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    int res; 

    pid = fork(); 
    if (pid < 0) 
    { 
     perror ("Fork error\n"); 
     exit(0); 
    } 

    if (pid == 0) 
    { 
     printf ("child(pid:%d) is waiting for signal\n", getpid()); 
     raise(SIGSTOP); 
     exit(0); 
    } 

    else 
    { 
     if ((waitpid(pid, NULL, WNOHANG)) == 0) 
     { 
      if ((res = kill(pid, SIGKILL)) == 0) 
      { 
       printf ("parent kill %d\n", pid); 
      } 
     } 

     waitpid(pid, NULL, 0); 
     exit(0); 

    } 
} 

回答

1

你打一個race condition。在孩子可以執行printf之前,父母正在執行kill。刪除WNOHANG,以便父母實際等待孩子停下來。此外,您需要添加WUNTRACED,以便waitpid報告停止(默認情況下,它只會報告終止)。最後,在這種情況下,您不應該將wait()的返回值對0進行測試。

+0

OP可能希望擺脫'WNOHANG'來實際等待'SIGSTOP'發生。 –

+0

謝謝,我在父母身上睡5s,我得到了預期的輸出,但有沒有更好的方法來做到這一點? – 217LeeSin

+0

如果您在回覆R時看到我的最後一條評論,請忽略它;那是錯的。 –