我希望能够在发送信号时跳出 while 循环。我不确定如何在不使用全局变量或写入文件的情况下完成此操作。我最好的选择是使用信号量吗?
#include <stdio.h>
#include <signal.h>
void random()
{
printf("random!");
}
int main(void) {
signal(SIGINT, random);
// I want this while loop to break if random executes
while (1)
{
pause();
}
// do more stuff after loop
return 0;
}
请您参考如下方法:
pause
会阻塞,直到收到调用信号处理程序的信号,因此您可以在 pause();
之后添加一个 break;
> 退出循环。因此,您不妨完全摆脱循环。
如果你想做的不是等待,而是循环做某事并且只在信号出现时退出,你不能使用pause
。显而易见的方法是使用全局变量,但你说你想避免这种情况。一个并不简单的替代方法是使用 sigprocmask
/sigpending
而不是信号处理程序:
int main()
{
setset_t signals;
sigemptyset(&signals);
sigaddset(&signals, SIGINT);
sigprocmask(SIG_BLOCK, &signals, 0); /* block SIGINT */
while (1) {
/* do stuff */
sigpending(&signals);
if (sigismember(&signals, SIGINT)) {
/* got a SIGINT */
break;
}
}
}