我在信号处理函数中读到add signal()函数可以重写默认行为:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void signalHandler();
int main(void) {
signal(SIGUSR1, signalHandler);
sleep(60);
printf("I wake up");
return 0;
}
void signalHandler() {
signal(SIGUSR1, signalHandler);// I add this line to overwrite the default behaviour
printf("I received the signal");
}
我用另一个过程触发它
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
kill(5061, SIGUSR1); // 5061 is the receiver pid, kill(argv[1], SIGUSR1) doesn't working, when I get 5061 as parameter
puts("send the signal ");
return 0;
}
接收机接收到
wake up
信号后立即处理SIGUSR1
。如何使接收器在接收到来自其他进程的信号时继续sleep
?顺便问一下,为什么当我得到5061作为参数时,
kill(5061, SIGUSR1);
5061是接收器pid,kill(argv[1], SIGUSR1)
不工作? 最佳答案
您的问题(为什么kill(argv[1], SIGUSR1)
不工作)实际上与信号无关,而是与基本的C编程有关。请在Linux上用gcc -Wall -g
(即所有警告和调试信息)编译,并改进代码,直到没有警告为止。
请仔细阅读kill(2)手册页(在Linux上,在Ubuntu或Debian上安装manpages
和manpages-dev
以及man-db
等软件包后,您可以键入man 2 kill
在您的计算机上阅读)。请仔细阅读signal(2)和signal(7)手册页。读几遍这些手册页。
然后,了解kill系统调用声明为
int kill(pid_t pid, int sig);
而且由于
pid_t
是某种整数类型,您需要将argv[1]
(这是一个字符串,即achar*
)转换为某个整数(而且kill(argv[1], SIGUSR1)
甚至不应该编译时没有错误,因为argv[1]
不是某个整数而是一个字符串)。所以请使用:kill((pid_t) atoi(argv[1]), SIGUSR1);
手册页还说,您应该使用
signal(SIGUSR1, SIG_DFL)
恢复默认行为,并使用signal(SIGUSR1, SIG_IGN)
忽略该信号。当然,您最好使用sigaction(2)作为
signal(2)
的手册页。最后,请养成阅读手册的习惯,花几个小时阅读好的书籍,如Advanced Linux Programming和Advanced Unix Programming。他们比我们几分钟内能解释的好得多。如果你不熟悉C编程,也可以读一些关于它的好书。
关于c - 如何覆盖(重置)SIGUSR1的默认行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13107187/