Unix和信号处理程序(C)

时间:2016-12-21 10:21:47

标签: c unix concurrency

我是一名学生,我正在尝试理解有关Unix编程的课程中的信号。

首先,我想测试一个简单的例子:一个进程生成一个子进程并需要确认实际的创建。 我叉子,在孩子里面,我发送一个SIGUSR1给父亲 kill(getppid(),SIGUSR1); 然后,在父亲内,我写了一个暂停(); sys调用阻塞进程直到收到信号,然后我写了 (sigaction(SIGUSR1,& sa,NULL)检查。

问题是,信号被发送并且程序停止,没有处理程序执行。

我用

编译它
$gcc -Wall -o test test.c

我没有收到警告,输出是

$I am the father
$I am the child
$User defined signal 1

我知道我可以通过其他方式执行此操作(使用sleep sys调用等),但我只是想了解为什么此代码不起作用。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void new_child (int sig){
    write(1,"I made a new child\n",50);
}

int main(){
    pid_t child;
    struct sigaction sa;            
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sa.sa_handler = new_child;
    switch(child = fork()){
        case -1:
            printf("Error.\n");
            exit(EXIT_FAILURE);
        case 0:
            printf("I am the child\n");
            kill(getppid(), SIGUSR1);
            break;
        default:
            printf("I am the father\n");
            pause();
            if (sigaction(SIGUSR1, &sa, NULL) == -1){
                printf("Signal error.\n");
                exit(EXIT_FAILURE);
            }
            printf("I'm done.");
            kill (child, SIGKILL);
            exit(EXIT_SUCCESS);
    }
}

我知道这个问题已被提出,但我似乎无法找到适用于我的解决方案。

1 个答案:

答案 0 :(得分:0)

您必须在代码的开头更改信号,以便在收到SIGUSR(Anjaneyulu)后立即执行。

您必须在代码的开头更改信号... ”此限制有点严格。信号处理程序需要在调用fork()之前最新安装。                     –alk