现在位置: 首页 > C 教程 > 正文

C 库函数 - sigprocmask()

C 标准库 - <signal.h> C 标准库 - <signal.h>

描述

在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;
}

输出结果

运行以上示例程序可能的输出结果如下:

SIGINT signal is blocked. Sleeping for 5 seconds...

在此期间,SIGINT 信号被阻塞,因此程序会等待 5 秒钟。

SIGINT signal is unblocked.

然后,程序解除了对 SIGINT 信号的阻塞,恢复正常处理该信号。

注意事项

  • 使用 sigprocmask 函数时要小心,确保不会长时间阻塞关键的信号(如 SIGKILLSIGSTOP),这些信号不能被阻塞或捕捉。
  • sigprocmask 函数可以用于控制在关键部分的信号处理,如临界区内避免处理中断信号。

C 标准库 - <signal.h> C 标准库 - <signal.h>