Skip to main content
 首页 » 编程设计

检查发送到您的应用程序的最后一个信号

2023年11月22日41jirigala

我希望能够在发送信号时跳出 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; 
        } 
    } 
}