嵌入式Linux:信号集
目录
1、信号集初始化
2、向信号集中添加或删除信号
3、测试信号是否在信号集中
在 Linux 系统中,处理多个信号时常用到一种数据结构:信号集(sigset_t
)。信号集允许我们将多个信号组织在一起,以便在系统调用中传递和操作。例如,sigaction()
、sigprocmask()
和 sigpending()
等系统调用都使用信号集作为参数。
信号集的数据结构定义如下:
#define _SIGSET_NWORDS (1024 / (8 * sizeof(unsigned long int)))
typedef struct {
unsigned long int __val[_SIGSET_NWORDS];
} sigset_t;
这个结构体可以表示一组信号。_SIGSET_NWORDS
计算了信号集数组所需的长整型数目,以便能够容纳所有可能的信号。
1、信号集初始化
sigemptyset()
用于初始化信号集,使其不包含任何信号。函数原型如下:
#include <signal.h>
int sigemptyset(sigset_t *set);
参数:
set
: 指向需要初始化的信号集变量的指针。
返回值:
- 成功时返回 0。
- 失败时返回 -1,并设置
errno
。
使用示例如下:
#include <signal.h>
int main() {
sigset_t sig_set;
if (sigemptyset(&sig_set) == -1) {
perror("sigemptyset");
return 1;
}
// 现在 sig_set 不包含任何信号
return 0;
}
sigfillset()
用于初始化信号集,使其包含所有信号,包括所有实时信号。函数原型如下:
#include <signal.h>
int sigfillset(sigset_t *set);
参数:
set
: 指向需要初始化的信号集变量的指针。
返回值:
- 成功时返回 0。
- 失败时返回 -1,并设置
errno
。
使用示例如下:
#include <signal.h>
int main() {
sigset_t sig_set;
if (sigfillset(&sig_set) == -1) {
perror("sigfillset");
return 1;
}
// 现在 sig_set 包含所有信号
return 0;
}
2、向信号集中添加或删除信号
sigaddset()
用于将一个信号添加到信号集中。函数原型如下:
#include <signal.h>
int sigaddset(sigset_t *set, int signum);
参数:
set
: 指向信号集的指针。signum
: 要添加的信号。
返回值:
- 成功时返回 0。
- 失败时返回 -1,并设置
errno
。
使用示例如下:
#include <signal.h>
int main() {
sigset_t sig_set;
if (sigemptyset(&sig_set) == -1) {
perror("sigemptyset");
return 1;
}
if (sigaddset(&sig_set, SIGINT) == -1) {
perror("sigaddset");
return 1;
}
// 现在 sig_set 包含 SIGINT 信号
return 0;
}
sigdelset()
用于将一个信号从信号集中删除。函数原型如下:
#include <signal.h>
int sigdelset(sigset_t *set, int signum);
参数:
set
: 指向信号集的指针。signum
: 要删除的信号。
返回值:
- 成功时返回 0。
- 失败时返回 -1,并设置
errno
。
使用示例如下:
#include <signal.h>
int main() {
sigset_t sig_set;
if (sigfillset(&sig_set) == -1) {
perror("sigfillset");
return 1;
}
if (sigdelset(&sig_set, SIGINT) == -1) {
perror("sigdelset");
return 1;
}
// 现在 sig_set 不包含 SIGINT 信号
return 0;
}
3、测试信号是否在信号集中
sigismember()
用于测试某个信号是否在指定的信号集中。函数原型如下:
#include <signal.h>
int sigismember(const sigset_t *set, int signum);
参数:
set
: 指向信号集的指针。signum
: 要测试的信号。
返回值:
- 如果信号
signum
在信号集set
中,则返回 1。 - 如果信号
signum
不在信号集set
中,则返回 0。 - 失败时返回 -1,并设置
errno
。
以下示例中,我们首先初始化了一个空的信号集,然后添加了 SIGINT
信号,并使用 sigismember()
函数检查信号集是否包含 SIGINT
信号。
#include <signal.h>
#include <stdio.h>
int main() {
sigset_t sig_set;
if (sigemptyset(&sig_set) == -1) {
perror("sigemptyset");
return 1;
}
if (sigaddset(&sig_set, SIGINT) == -1) {
perror("sigaddset");
return 1;
}
if (sigismember(&sig_set, SIGINT)) {
puts("信号集中包含 SIGINT 信号");
} else {
puts("信号集中不包含 SIGINT 信号");
}
return 0;
}