C用环路等待信号
在C Linux中,有没有办法在没有循环的情况下等待SIGUSR1和SIGUSR2这样的信号 对于这段代码中的eaxmple,我等待SIGUSR1或SIGUSR2打印消息,但当我想打印消息时,我会在true时打印消息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
#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;
}