MST

星途 面试题库

面试题:C语言中解除Linux信号屏蔽的常见函数有哪些

在Linux环境下使用C语言编程,要解除对信号的屏蔽,通常会用到哪些函数?请简述这些函数的基本用法及参数含义。
39.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在Linux环境下使用C语言编程,解除对信号的屏蔽通常会用到以下函数:

sigprocmask函数

  1. 基本用法: 用于检测或更改信号屏蔽字。它可以查询当前信号屏蔽字,也可以将其设置为新的值,或者在当前屏蔽字基础上添加或移除某些信号。
  2. 函数原型
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
  1. 参数含义
    • how:指定如何更改信号屏蔽字,有以下取值:
      • SIG_BLOCK:将 set 指向的信号集添加到当前信号屏蔽字中,即屏蔽 set 中的信号。
      • SIG_UNBLOCK:将 set 指向的信号集从当前信号屏蔽字中移除,即解除对 set 中的信号的屏蔽。
      • SIG_SETMASK:将当前信号屏蔽字设置为 set 指向的信号集。
    • set:指向一个信号集,该信号集指定要更改的信号,若为 NULL,则 how 参数无意义,仅用于查询当前信号屏蔽字。
    • oldset:指向一个信号集,用于保存调用 sigprocmask 前的信号屏蔽字,若为 NULL,则不保存旧的信号屏蔽字。

sigemptyset和sigaddset函数

这两个函数常配合 sigprocmask 函数使用来构建信号集。

sigemptyset函数

  1. 基本用法: 初始化一个信号集,使其不包含任何信号。
  2. 函数原型
#include <signal.h>
int sigemptyset(sigset_t *set);
  1. 参数含义set:指向要初始化的信号集。成功时返回0,失败时返回 - 1。

sigaddset函数

  1. 基本用法: 将指定信号添加到信号集中。
  2. 函数原型
#include <signal.h>
int sigaddset(sigset_t *set, int signum);
  1. 参数含义
    • set:指向要添加信号的信号集。
    • signum:要添加到信号集中的信号编号。成功时返回0,失败时返回 - 1。

例如,解除对SIGINT信号的屏蔽,可以这样使用:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() {
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    sigprocmask(SIG_UNBLOCK, &set, NULL);
    while(1) {
        sleep(1);
        printf("Running...\n");
    }
    return 0;
}

此代码首先初始化一个信号集,添加SIGINT信号到信号集,然后使用 sigprocmask 函数解除对SIGINT信号的屏蔽。程序运行时可以通过按下 Ctrl+C (产生SIGINT信号)来终止程序。