我在信号处理函数中读到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上安装manpagesmanpages-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 ProgrammingAdvanced Unix Programming。他们比我们几分钟内能解释的好得多。如果你不熟悉C编程,也可以读一些关于它的好书。

关于c - 如何覆盖(重置)SIGUSR1的默认行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13107187/

10-16 05:02