SIGUSR1 信号未触发
SIGUSR1 Signal is not triggering
我开始学习信号以及如何触发它们。我有这个使用 SIGUSR1 触发信号的简单代码,但是当我 运行 代码时,唯一打印的是“Starting...”行。没有其他东西被打印出来。我做错了什么吗?
#include <signal.h>
#include <stdio.h>
void my_handler(int signum)
{
printf("Hello\n");
printf("%d\n", signum);
if (signum == SIGUSR1) {
printf("Receveid\n");
}
}
int main() {
printf("Starting...\n");
signal(SIGUSR1, my_handler);
return 0;
}
signal
only registers a signal handler - the function to be called when the process receives a signal. From within your program, you can use raise
到向调用进程发送信号。
如果你在 POSIX 环境中,你应该看看 man 7 signal-safety
for a list of functions that are safe to call from within signal handlers (additional information in this answer). printf
is not included in this list - nor are a lot standard library functions. Its better to use an operation which is atomic with regards to signals, such as write
(or reentrant, such as strlen
)。
使用 raise
的粗略示例,其中 returns 0
成功,非零错误。
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void my_handler(int signum) {
char msg[] = "SIGUSR1 handler\n";
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");
}
我开始学习信号以及如何触发它们。我有这个使用 SIGUSR1 触发信号的简单代码,但是当我 运行 代码时,唯一打印的是“Starting...”行。没有其他东西被打印出来。我做错了什么吗?
#include <signal.h>
#include <stdio.h>
void my_handler(int signum)
{
printf("Hello\n");
printf("%d\n", signum);
if (signum == SIGUSR1) {
printf("Receveid\n");
}
}
int main() {
printf("Starting...\n");
signal(SIGUSR1, my_handler);
return 0;
}
signal
only registers a signal handler - the function to be called when the process receives a signal. From within your program, you can use raise
到向调用进程发送信号。
如果你在 POSIX 环境中,你应该看看 man 7 signal-safety
for a list of functions that are safe to call from within signal handlers (additional information in this answer). printf
is not included in this list - nor are a lot standard library functions. Its better to use an operation which is atomic with regards to signals, such as write
(or reentrant, such as strlen
)。
使用 raise
的粗略示例,其中 returns 0
成功,非零错误。
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void my_handler(int signum) {
char msg[] = "SIGUSR1 handler\n";
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");
}