从孩子到父母发送信号

时间:2017-11-04 04:14:39

标签: c signals

这里我想在父母睡觉时向父母发送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 个答案:

答案 0 :(得分:4)

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

#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;
}

答案 1 :(得分:3)

发送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;
}