Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的Linux信号处理程序对信号没有反应?_C_Linux_Signals - Fatal编程技术网

C 为什么我的Linux信号处理程序对信号没有反应?

C 为什么我的Linux信号处理程序对信号没有反应?,c,linux,signals,C,Linux,Signals,为什么我发出USR1和USR2信号时,它没有反应?您的信号处理工作正常。只是/n不是新行字符。因为不打印新行,所以所有输出都保存在缓冲区中。当您使用kill signal终止进程时,此缓冲区将被丢弃。如有许多评论和回复,请在printf格式字符串中使用\n而不是/n。或调用,例如添加fflush(NULL)在您的printf之后 但是,在信号处理程序中调用printf是错误的。请参阅有关异步信号安全函数的说明(printf不是异步信号安全函数) 实际上,信号处理程序最好设置一些volatile

为什么我发出USR1和USR2信号时,它没有反应?

您的信号处理工作正常。只是
/n
不是新行字符。因为不打印新行,所以所有输出都保存在缓冲区中。当您使用kill signal终止进程时,此缓冲区将被丢弃。

如有许多评论和回复,请在
printf
格式字符串中使用
\n
而不是
/n
。或调用,例如添加
fflush(NULL)在您的
printf
之后

但是,在信号处理程序中调用
printf
是错误的。请参阅有关异步信号安全函数的说明(
printf
不是异步信号安全函数)

实际上,信号处理程序最好设置一些
volatile sigamatic\u t
标志,这些标志应该在代码中的一些重要位置进行测试

如果使用某个事件循环,建议的技巧是在程序的开头附近创建一些,在事件循环中轮询该管道(例如,通过使用),并在信号处理程序中写入该管道(
write
is async signal safe!)


另见。

printf(“/n”)-->
printf(“\n”)顺便说一句:您不应该在信号处理程序中使用printf()。代码是从某处复制的,我没有注意到“/n”。实际上,这种信号处理是错误的,因为
printf
不是异步信号安全的。看见
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

static void pr_mask(const char * string) {
    sigset_t procmask;

    sigprocmask(SIG_SETMASK, NULL, &procmask);

    printf("%s: ", string);
    if(sigismember(&procmask, SIGINT))
        printf("SIGINT ");
    if(sigismember(&procmask, SIGUSR1))
        printf("SIGUSR1 ");
    if(sigismember(&procmask, SIGUSR2))
        printf("SIGUSR2 ");
    if(sigismember(&procmask, SIGTERM))
        printf("SIGTERM ");
    if(sigismember(&procmask, SIGQUIT))
        printf("SIGQUIT ");
    printf("/n");
}

static void sigusr(int signum)
{
    pr_mask("int sigusr");

    if(signum == SIGUSR1)
        printf("SIGUSR1 received/n");
    else if(signum == SIGUSR2)
        printf("SIGUSR2 received/n");
    else
        printf("signal %d received/n", signum);
}

int main(void)
{
    if(signal(SIGUSR1, sigusr) == SIG_ERR) {
        printf("error catching SIGUSR1/n");
        exit(1);
    }

    if(signal(SIGUSR2, SIG_IGN) == SIG_ERR) {
        printf("error ignoring SIGUSR2/n");
        exit(1);
    }

    if(signal(SIGINT, SIG_DFL) == SIG_ERR) {
        printf("error setting SIGINT to default/n");
        exit(1);
    }

    while(1)
        pause();

    exit(0);
}
tomxue@ubuntu:~$ ./a.out &
[2] 5554
[1]   Killed                  ./a.out
tomxue@ubuntu:~$ kill -USR1 5554
tomxue@ubuntu:~$ kill -USR2 5554
tomxue@ubuntu:~$ kill -9 5554
[2]+  Killed                  ./a.out