sigprocmask()函数学习笔记
时间: 2023-07-18 16:34:25 浏览: 34
`sigprocmask()`函数是一个用于设置进程信号掩码的系统调用函数。进程信号掩码是指一组信号,进程在处理其中一个信号时,可以被同一组中的其他信号所阻塞。
`sigprocmask()`函数的原型如下:
```c
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
```
参数说明:
- `how`: 用来指定信号掩码的修改方式,有三种取值:
- `SIG_BLOCK`: set 指向的信号集中的信号被添加到当前信号掩码中;
- `SIG_UNBLOCK`: set 指向的信号集中的信号从当前信号掩码中移除;
- `SIG_SETMASK`: 当前信号掩码被 set 指向的信号集替换。
- `set`: 用来设置信号掩码的信号集。
- `oldset`: 用来保存之前的信号掩码。
`sigprocmask()`函数的返回值为 0 表示成功,为 -1 表示失败,并设置 `errno`。
示例代码如下:
```c
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main() {
sigset_t new_mask, old_mask;
sigemptyset(&new_mask);
sigaddset(&new_mask, SIGINT);
sigprocmask(SIG_BLOCK, &new_mask, &old_mask);
printf("Signal SIGINT blocked. Sleeping for 5 seconds...\n");
sleep(5);
sigprocmask(SIG_SETMASK, &old_mask, NULL);
printf("Signal SIGINT unblocked.\n");
return 0;
}
```
上述代码中,我们首先创建了一个新的信号集 `new_mask`,其中添加了 `SIGINT` 信号。然后我们使用 `sigprocmask()` 函数将 `new_mask` 中的信号添加到当前进程的信号掩码中,使得 `SIGINT` 信号被阻塞。接着我们使用 `sleep()` 函数暂停进程执行 5 秒钟,期间如果有 `SIGINT` 信号产生,那么该信号会被阻塞。最后我们使用 `sigprocmask()` 函数恢复之前的信号掩码,解除对 `SIGINT` 信号的阻塞。