Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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用环路等待信号_C_Linux_Signals_Signal Handling - Fatal编程技术网

C用环路等待信号

C用环路等待信号,c,linux,signals,signal-handling,C,Linux,Signals,Signal Handling,在C Linux中,有没有办法在没有循环的情况下等待SIGUSR1和SIGUSR2这样的信号 对于这段代码中的eaxmple,我等待SIGUSR1或SIGUSR2打印消息,但当我想打印消息时,我会在true时打印消息 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> void signal_callback_handler(int sign

在C Linux中,有没有办法在没有循环的情况下等待SIGUSR1和SIGUSR2这样的信号

对于这段代码中的eaxmple,我等待SIGUSR1或SIGUSR2打印消息,但当我想打印消息时,我会在true时打印消息

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void signal_callback_handler(int signum)
{
   printf("Caught signal %d\n",signum); 
}

int main()
{
   signal(SIGUSR1, signal_callback_handler);
   signal(SIGUSR2, signal_callback_handler);
   while(1)
   {
      printf("Program processing stuff here.\n");
      sleep(1);
   }
   return EXIT_SUCCESS;
}

有两种可能性:

暂停或 西格瓦特 暂停文档:

Descriptionpause导致调用进程或线程休眠,直到发送终止进程或导致线程停止的信号为止 调用信号捕获函数

资料来源: 以及sigwait的文档:

description sigwait函数暂停调用线程的执行,直到信号集中指定的一个信号变为挂起。函数接受信号,将其从待处理信号列表中删除,并返回sig中的信号号

资料来源:


这两种功能都符合POSIX.1-2001的要求

您可以使用select。这是从我的头顶上,因为我知道选择可以永远阻止。可能还有很多其他可能的技巧。你可能想阅读有关睡眠的手册页。在linux上,睡眠由信号终止。所以你可以睡很长时间——比如说几年——当你醒来时,检查你的信号处理器是否被调用。顺便说一下,在信号处理器中调用printf不是一个好主意;参见man 7 signalDon't use printf in signal handlers,ever.POSIX规范:和。不要试图使用-它已经过时,这意味着它只能由已经使用它的现有代码使用,而不能由任何新代码使用。@JonathanLeffler所以使用'sigwait'可以吗?@joifdoi:是的,使用sigwait或pause都可以。使用sigwait暂停线程。暂停功能是更古老的预断代线程的一个长边距,并举行了一个进程中的唯一线程。我倾向于使用暂停,因为我也会提前更新线程;如今,sigwait可能是更好的选择。它提供了更好的选择性-您可以指定您感兴趣的信号,而当收到任何信号时,暂停会返回。有两种以上的可能性。poll0,0,-1是第三个。还有很多其他的。请注意,sigwait将消耗信号,并且不会调用处理程序。我会用sig。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void signal_callback_handler(int signum)
{
   printf("Caught signal %d\n",signum); 
}

int main()
{
   signal(SIGUSR1, signal_callback_handler);
   signal(SIGUSR2, signal_callback_handler);

    printf("this line happned after signal arrived \n ");
   return EXIT_SUCCESS;
}