【发布时间】:2019-06-02 06:24:29
【问题描述】:
我正在尝试通过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 语句。任何相同的帮助将不胜感激。
【问题讨论】:
-
c应该是pid_t而不是int并且父进程也不会一直等待信号 -
从信号处理程序中调用
printf()是不安全的。每footnote 188 of the C standard:“因此,信号处理程序通常不能调用标准库函数。” POSIX 允许使用信号处理程序调用异步信号安全函数。printf()不是异步信号安全的。 -
@firstlegagain1 我并不是说它正在完全运行,只是指出它可以在孩子尝试发送信号之前退出
-
用你从答案中学到的东西来改变你的问题被认为是不好的做法,因为这样答案和 cmets 不再有意义:你添加了
else if(c == -1) -
您是否(重新)编译和测试了您发布的代码?尽管存在一些问题,但很难看出这会导致段错误。
标签: c operating-system signals system-calls