面试题答案
一键面试在Linux环境下使用C语言编程,解除对信号的屏蔽通常会用到以下函数:
sigprocmask函数
- 基本用法: 用于检测或更改信号屏蔽字。它可以查询当前信号屏蔽字,也可以将其设置为新的值,或者在当前屏蔽字基础上添加或移除某些信号。
- 函数原型:
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
- 参数含义:
how
:指定如何更改信号屏蔽字,有以下取值:SIG_BLOCK
:将set
指向的信号集添加到当前信号屏蔽字中,即屏蔽set
中的信号。SIG_UNBLOCK
:将set
指向的信号集从当前信号屏蔽字中移除,即解除对set
中的信号的屏蔽。SIG_SETMASK
:将当前信号屏蔽字设置为set
指向的信号集。
set
:指向一个信号集,该信号集指定要更改的信号,若为NULL
,则how
参数无意义,仅用于查询当前信号屏蔽字。oldset
:指向一个信号集,用于保存调用sigprocmask
前的信号屏蔽字,若为NULL
,则不保存旧的信号屏蔽字。
sigemptyset和sigaddset函数
这两个函数常配合 sigprocmask
函数使用来构建信号集。
sigemptyset函数
- 基本用法: 初始化一个信号集,使其不包含任何信号。
- 函数原型:
#include <signal.h>
int sigemptyset(sigset_t *set);
- 参数含义:
set
:指向要初始化的信号集。成功时返回0,失败时返回 - 1。
sigaddset函数
- 基本用法: 将指定信号添加到信号集中。
- 函数原型:
#include <signal.h>
int sigaddset(sigset_t *set, int signum);
- 参数含义:
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信号)来终止程序。