2017-11-04 91 views
1

这里我想在睡觉时向家长发送SIGINT信号。我已经通过编写程序来尝试它。在这个程序中,我不明白为什么来自父项的SIGINT信号处理程序根本没有执行? 这里是代码:将信号从孩子发送给父母

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
#include<stdlib.h> 
void sig_usr(int signo){ 
    if(signo == SIGINT) 
    printf("Signal caught!"); 
    return; 
} 

int main(void){ 
    pid_t pid, ppid; 
    ppid = getpid(); 
    printf("ppid = %d\n", ppid); 
    if((pid = fork()) == 0){ 
     printf("killing parent...\n"); 
     kill(ppid, SIGINT); 
     printf("After killing parent...\n"); 
    } 
    else{ 
     sleep(5); 
     printf("%d %d ",ppid, pid); 
     if(signal(SIGINT,sig_usr) == SIG_ERR) 
      printf("Signal processed "); 
    } 
    return 0; 
} 

输出: 输出仅打印这么多的内容。我认为父母根本没有执行任何事情。

The output is printing only this much content. I think parent is not executing at all.

回答

2

您需要设置信号处理程序之前SIGINT被发送到父进程,否则,该处理程序将不会被执行。另外,父进程在执行任何事情之前被杀死。解决这个问题的简单方法是在父进程的代码之后移动睡眠调用,并向子进程添加延迟。

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
#include<stdlib.h> 
void sig_usr(int signo){ 
    if(signo == SIGINT) 
    printf("Signal caught!"); 
    return; 
} 

int main(void){ 
    pid_t pid, ppid; 
    ppid = getpid(); 
    printf("ppid = %d\n", ppid); 
    if((pid = fork()) == 0){ 
     sleep(1); // Wait for parent to finish setting up 
     printf("killing parent...\n"); 
     kill(ppid, SIGINT); 
     printf("After killing parent...\n"); 
    } 
    else{ 
     printf("%d %d ",ppid, pid); 
     if(signal(SIGINT,sig_usr) == SIG_ERR) 
      printf("Signal processed "); 
     sleep(5); // Wait to be killed 
    } 
    return 0; 
} 
+0

谢谢@ ID0 – Vijesh

2

当您发送SIGINT signal尚未调用。

我想你想发送SIGINT之前设置信号处理程序:

#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 
#include<stdlib.h> 
void sig_usr(int signo){ 
    if(signo == SIGINT) 
    printf("Signal caught!"); 
    return; 
} 

int main(void){ 
    pid_t pid, ppid; 
    ppid = getpid(); 
    printf("ppid = %d\n", ppid); 
    if((pid = fork()) == 0){ 
     sleep(1); 
     printf("killing parent...\n"); 
     kill(ppid, SIGINT); 
     printf("After killing parent...\n"); 
    } 
    else{ 
     printf("%d %d ",ppid, pid); 
     if(signal(SIGINT,sig_usr) == SIG_ERR) 
      printf("Signal processed "); 
     sleep(5); 
    } 
    return 0; 
}