我开始学习信号以及如何触发它们。我有这个使用SIGUSR1触发信号的简单代码,但是当我运行代码时,唯一打印的东西是"Starting…"线。没有别的东西被印出来。我做错了什么吗?
#include <signal.h>
#include <stdio.h>
void my_handler(int signum)
{
printf("Hellon");
printf("%dn", signum);
if (signum == SIGUSR1) {
printf("Receveidn");
}
}
int main() {
printf("Starting...n");
signal(SIGUSR1, my_handler);
return 0;
}
signal
只注册一个信号处理程序——当进程接收到信号时调用的函数。在程序中,您可以使用raise
向调用进程发送信号。
如果您在POSIX环境中,您应该查看man 7 signal-safety
,以获取可以从信号处理程序中安全调用的函数列表(在此回答中提供额外信息)。printf
没有包括在这个列表中——也没有很多标准库函数。对于信号,最好使用原子操作,如write
(或可重入操作,如strlen
)。
一个使用raise
的粗略示例,成功时返回0
,错误时返回非零值。
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void my_handler(int signum) {
char msg[] = "SIGUSR1 handlern";
if (signum == SIGUSR1)
write(STDOUT_FILENO, msg, strlen(msg));
}
int main(void) {
printf("Starting...n");
signal(SIGUSR1, my_handler);
(void) getchar();
if (raise(SIGUSR1) != 0)
fprintf(stderr, "Could not raise signal.n");
}