C 库函数 - sigprocmask()
描述
在C语言中,sigprocmask
函数用于检查或修改当前进程的信号屏蔽字(signal mask)。信号屏蔽字决定了在屏蔽期间哪些信号会被阻塞,即暂时不会被处理。
语法
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
参数
int how
:操作标志,决定如何修改信号屏蔽字:SIG_BLOCK
:把set
指向的信号集中的信号添加到当前信号屏蔽字中。SIG_UNBLOCK
:从当前信号屏蔽字中移除set
指向的信号集中的信号。SIG_SETMASK
:用set
指向的信号集替换当前信号屏蔽字。
const sigset_t *set
:指向要修改的新信号集的指针。sigset_t *oldset
:如果不为NULL
,则存储之前的信号屏蔽字。
返回值
- 成功时返回 0。
- 失败时返回 -1,并设置
errno
以指示错误类型。
示例
以下是一个简单的示例程序,演示如何使用 sigprocmask
函数来阻塞 SIGINT
信号,然后解除阻塞并查看之前的信号屏蔽字:
实例
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main() {
sigset_t new_mask, old_mask;
// 初始化新信号集,只包含 SIGINT
sigemptyset(&new_mask);
sigaddset(&new_mask, SIGINT);
// 设置新的信号屏蔽字,阻塞 SIGINT 信号
if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
perror("sigprocmask");
return 1;
}
printf("SIGINT signal is blocked. Sleeping for 5 seconds...\n");
sleep(5);
// 解除对 SIGINT 的阻塞
if (sigprocmask(SIG_UNBLOCK, &new_mask, NULL) == -1) {
perror("sigprocmask");
return 1;
}
printf("SIGINT signal is unblocked.\n");
return 0;
}
#include <signal.h>
#include <unistd.h>
int main() {
sigset_t new_mask, old_mask;
// 初始化新信号集,只包含 SIGINT
sigemptyset(&new_mask);
sigaddset(&new_mask, SIGINT);
// 设置新的信号屏蔽字,阻塞 SIGINT 信号
if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
perror("sigprocmask");
return 1;
}
printf("SIGINT signal is blocked. Sleeping for 5 seconds...\n");
sleep(5);
// 解除对 SIGINT 的阻塞
if (sigprocmask(SIG_UNBLOCK, &new_mask, NULL) == -1) {
perror("sigprocmask");
return 1;
}
printf("SIGINT signal is unblocked.\n");
return 0;
}
输出结果
运行以上示例程序可能的输出结果如下:
SIGINT signal is blocked. Sleeping for 5 seconds...
在此期间,SIGINT 信号被阻塞,因此程序会等待 5 秒钟。
SIGINT signal is unblocked.
然后,程序解除了对 SIGINT
信号的阻塞,恢复正常处理该信号。
注意事项
- 使用
sigprocmask
函数时要小心,确保不会长时间阻塞关键的信号(如SIGKILL
或SIGSTOP
),这些信号不能被阻塞或捕捉。 sigprocmask
函数可以用于控制在关键部分的信号处理,如临界区内避免处理中断信号。