#include <signal.h>
#include <errno.h>
#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);
return 0;
}
int sigdelset(sigset_t *set, int signo)
{
if (SIGBAD(signo)) { errno =EINVAL; return -1; }
*set &= ~(1 << (signo - 1));
return 0;
}
int sigismember(const sigset_t *set, int signo)
{
if (SIGBAD(signo)) { errno = EINVAL; return -1; }
return ((*set & (1 << (signo -1))) != 0);
}
这意味着你试图对不是整数而是结构的东西进行位运算。
对于sigset_t
,已经存在名为sigaddset、sigdelset和sigismember的函数,您不应该重新实现它们。sigset_t
是一个不透明的东西,除了sigXXXset()函数
数据类型:sigset_t
sigset_t数据类型用于表示信号集。在内部,它可以实现为整数或结构类型。
为了便于移植,请仅使用本节中描述的功能初始化、更改和检索sigset_t中的信息对象--不要试图直接操作它们。
编辑:以下是我的想法。您可能正在尝试编译从某个地方复制的代码(书籍、开源等)。这些函数已经存在于库中,不应重写。但是,如果您真的想这样做,请记住,最初的代码编写者假设sigset_t是整数或整型,而不是结构。
由于在使用sigset_t编译的系统中,可能(我很确定它是)被定义为一个结构,因此代码不会编译。
可能的解决方案:
- 将sigsett重新定义为整数(不要包含定义原始sigsett的系统头)
- 更改代码以使用定义的sigsett进行编译,如下面的示例所示(超级危险)
int sigaddset(sigset_t *set, int signo)
{
if (SIGBAD(signo))
{
errno = EINVAL;
return(-1);
}
set->bits |= 1 << (signo - 1);
return 0;
}
修复代码。
按位&
和|
运算符需要两边都有整数(两个整数操作数)。
您似乎正在(重新)实现标准库函数。因此,你必须了解类型sigset_t
的内部,但不清楚它的类型是什么。如果你不知道类型的细节是什么,你就没有业务重新实现这些功能。
在Mac OS X上,如果您在系统头中跟踪足够远,那么sigset_t
就是__uint32_t
,所以上面的代码看起来应该可以工作。如果sigset_t
在您的机器上实际上不是一个整数,那么您的代码将失败,并出现与您得到的错误类似的错误。因此,除非正在实现库,否则您应该单独使用库提供的内容,而不是编写自己的标准函数的盗版版本。