qfedu-linux-advanced-level/day3/signal_other/test_sigset_t.c

49 lines
1.3 KiB
C
Raw Permalink Normal View History

2023-08-17 09:20:18 +08:00
// 信号集问题
#define _XOPEN_SOURCE 700
#include <signal.h>
#include <errno.h>
// #include <sigset.h>
// 定义一个宏,用于检查信号编号是否有效
#define _NSIG 64
#define NSIG _NSIG
#define SIGBAD(signo) ((signo) <= 0 || (signo) >= NSIG)
// 向信号集中添加一个信号
int sigaddset(sigset_t *set, int signo)
{
// 检查信号编号是否有效
if (SIGBAD(signo))
{
errno = EINVAL; // 设置错误码为无效参数
return (-1); // 返回错误
}
*set |= 1 << (signo - 1); /* 将对应位设置为1 */
return (0); // 返回成功
}
// 从信号集中删除一个信号
int sigdelset(sigset_t *set, int signo)
{
// 检查信号编号是否有效
if (SIGBAD(signo))
{
errno = EINVAL; // 设置错误码为无效参数
return (-1); // 返回错误
}
*set &= ~(1 << (signo - 1)); /* 将对应位设置为0 */
return (0); // 返回成功
}
// 检查一个信号是否在信号集中
int sigismember(const sigset_t *set, int signo)
{
// 检查信号编号是否有效
if (SIGBAD(signo))
{
errno = EINVAL; // 设置错误码为无效参数
return (-1); // 返回错误
}
return ((*set & (1 << (signo - 1))) != 0); // 返回信号是否在信号集中
}