49 lines
1.3 KiB
C
49 lines
1.3 KiB
C
// 信号集问题
|
|
#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); // 返回信号是否在信号集中
|
|
}
|