2014-01-07 32 views
0

我有以下代码,其中父母创建多个子进程并在之后将其杀死。一旦遇害,我想打印什么杀死了孩子(在这种情况下是信号)。但是,代码不打印。什么似乎是问题?如何让孩子打印杀死它的信号?

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

int i; 

static void signal_handler(int signo) 
{ 
    if (signo == SIGUSR1) 
    { 
    printf("child %d received sigusr1\n", i + 1); 
    } 
} 

int main(void) 
{ 
    char buff[50]; 
    int status; 

    if (signal(SIGUSR1, signal_handler) == SIGUSR1) 
    { 
    perror("Signal handling error"); 
    } 

    pid_t cpid, count; 

    for (i = 0; i < 5; i++) 
    { 
    cpid = fork(); 

    if (cpid == 0) 
    { 
     sleep(10); 

     //exit(0); 
    } 
    else if (cpid > 0) 
    { 
     kill(cpid, SIGUSR1); 
     int status; 
     int n = waitpid(cpid, &status, 0); 

     if (n != cpid) 
     { 
     perror("error"); 
     } 

     if (WIFSIGNALED(status)) 
     { /* get WTERMSIG(status) */ 
     printf("killed by signal=%d\n", WTERMSIG(status)); 
     } 
    } 
    else 
    { 
     perror("Fork error: "); 
     exit(1); 
    } 
    } 
} 
+0

嗯 - 我想在父母的杀人信号到达之前,孩子们终止并退出(0)。应让儿童保持活跃与睡眠(),所以他们仍然在SIGUSR信号到达。 – user422005

+0

我试过,但它仍然没有打印这部分: printf(“杀死信号=%d \ n”); WTERMSIG(status); – user3015353

回答

0

使用waitpid代替,并且一定要处理正常退出并杀害按信号:

pid_t pid = fork(); 

if (pid == 0) 
{ 
    exit(0); 
} 
else if (pid > 0) 
{ 
    int status; 
    int n = waitpid(pid, &status, 0); 

    if (n != pid)     { /* error */ } 
    else if (WIFSIGNALED(status)) { /* get WTERMSIG(status) */ } 
    else if (WIFEXITED(status)) { /* get WEXITSTATUS(status) */ } 
} 
else if (pid < 0) 
{ 
    /* error */ 
} 

你可以从文档中看到,wait将等待任何孩子,不只是现在的孩子。当然,在接收信号之前,孩子完全有可能正常退出。

你可以通过调用pause来阻止孩子正常退出,但是如果不是得到处理,信号将只会杀死孩子。如果信号处理程序返回,则返回pause

+0

我如何确保孩子只因信号而死亡? – user3015353

+0

@ user3015353:让孩子不出口,例如无限期地睡眠。 –

+0

@ user3015353:或者在子中调用'pause'。 –

0

这是你的应用程序的实际代码?

printf("killed by signal=%d\n"); 
WTERMSIG(status); 

如果是这样,第二行有没有效果,尝试将其更改为:

printf("killed by signal=%d\n", WTERMSIG(status)); 
+0

我已经发布了编辑版本,你可以请看看它。 '被信号杀死'的行仍然没有被打印 – user3015353

+0

正如@duck所提出的那样,我删除了信号处理程序,现在'信号行'被打印出来了。感谢您的帮助。 – user3015353

1

WIFSIGNALED(stat_val) - 如果状态是为孩子返回值是一个非零值过程要在收到未被捕获

你的信号的信号终止由于被抓(当他们再在他们退出之前先行通过)。

您有别人提到的其他问题。

+0

谢谢你的回答。 – user3015353