如何通过kill命令从子进程向父进程发送信号

时间:2019-01-07 15:07:48

标签: c operating-system signals system-calls

我试图通过fork()系统调用创建一个子进程,然后尝试向父进程发送信号并在屏幕上打印出一些内容。

这是我的代码:-

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

void func1(int signum) {
    if(signum == SIGUSR2) {
        printf("Received sig from child\n");
    }
}

int main() {
    signal(SIGUSR2, func1);

    int c = fork();
    if(c > 0) {
        printf("parent\n");
    }
    else if(c == -1) {
        printf("No child");
    }
    else {
        kill(getppid(), SIGUSR2);
        printf("child\n");
    }

}

执行程序时,我得到的是:-

child
Segmentation fault (core dumped)

我是C语言系统调用的新手,不知道为什么会这样,以及如何获得所需的输出,这将打印所有三个printf语句。对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您的代码有许多小问题,并且肯定具有未定义的行为,即,您不能从信号处理程序中调用printf或其他异步信号不安全函数。 这是带有修复程序的代码(请参阅代码中的注释)。 应该按预期方式工作(没有特定的打印语句顺序),并查看此代码是否仍然存在段错误。

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

void func1(int signum)
{
    /* write is asyc-signal-safe */
    write(1, "Received sig from child\n", sizeof "Received sig from child\n" - 1);
}

int main()
{
    signal(SIGUSR2, func1);

    /* fork returns a pid_t */
    pid_t c = fork();
    if(c > 0) {
        printf("parent\n");
        /* Wait for the child to exit; otherwise, you may not receive the signal */
        if (wait(NULL) == -1) {
            printf("wait(2) failed\n");
            exit(1);
        }
    } else if (c == -1) {
        printf("fork(2) error\n");
        exit(1);
    } else {
        if (kill(getppid(), SIGUSR2) == -1) {
            /* In case kill fails to send signal... */
            printf("kill(2) failed\n");
            exit(1);
        }
        printf("child\n");
    }
}