在Linux系统中,程序可以通过调用`sigprocmask`函数来屏蔽信号,以防止它们在处理特定任务时被中断。以下是屏蔽信号的基本步骤和示例代码:
声明信号集
使用`sigset_t`类型的变量来表示信号集。
操作信号集
`sigemptyset`:清空信号集。
`sigfillset`:将信号集设置为包含所有信号。
`sigaddset`:向信号集中添加特定信号。
`sigdelset`:从信号集中移除特定信号。
`sigismember`:检查特定信号是否在信号集中。
设置信号屏蔽
使用`sigprocmask`函数来设置信号掩码,该函数有三种操作方式:
`SIG_BLOCK`:根据参数`set`提供的屏蔽字屏蔽信号,并将原信号屏蔽保存到`oldset`中。
`SIG_UNBLOCK`:根据参数`set`提供的屏蔽字解除信号屏蔽。
`SIG_SETMASK`:根据参数`set`提供的信号设置重新设置系统信号设置。
```c
include include include void block_signal(int signum) { sigset_t sigs; sigemptyset(&sigs); sigaddset(&sigs, signum); // 屏蔽信号 if (sigprocmask(SIG_BLOCK, &sigs, NULL) == -1) { perror("sigprocmask"); exit(EXIT_FAILURE); } // 在这里执行需要屏蔽信号的代码 printf("Signal %d is blocked.\n", signum); // 解除信号屏蔽 if (sigprocmask(SIG_UNBLOCK, &sigs, NULL) == -1) { perror("sigprocmask"); exit(EXIT_FAILURE); } printf("Signal %d is unblocked.\n", signum); } int main() { // 屏蔽 SIGINT 信号 block_signal(SIGINT); // 模拟程序执行 while (1) { printf("Main thread is running...\n"); sleep(1); } return 0; } ``` 在这个示例中,`block_signal`函数首先创建一个信号集,然后使用`sigprocmask`函数将其设置为屏蔽`SIGINT`信号。在屏蔽信号后,程序可以安全地执行一些操作,而不会被`SIGINT`信号中断。完成操作后,使用`SIG_UNBLOCK`解除信号屏蔽。 请注意,信号屏蔽是一种临时的解决方案,它只在当前进程的上下文中有效。当进程终止或调用`sigprocmask`函数时,之前设置的信号屏蔽将恢复为之前的设置。此外,某些信号(如`SIGKILL`和`SIGSTOP`)不能被屏蔽。