#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);
}发布于 2012-03-06 21:20:48
这意味着你正在尝试对不是整数而是结构的东西进行位操作。
对于sigset_t,已经存在名为sigaddset、sigdelset和sigismember的函数,您不应该重新实现它们。sigset_t是一个不透明的东西,除了sigXXXset()函数之外,您不应该使用其他函数来查看它
发布于 2012-03-06 21:21:46
数据类型: sigset_t
为了便于移植,请仅使用本节中描述的函数来初始化、更改和检索sigset_t对象中的信息-不要尝试直接操作它们。
编辑:这里是我的想法。您可能正在尝试编译从某处(一本书、开放源代码等)复制的代码。这些函数已经存在于库中,不应该被重写。但是如果您真的想这样做,那么请记住,原始代码编写者假设sigset_t是整数或整数类型,而不是结构。
由于在系统中使用sigset_t编译的代码可能被定义为一个结构(我很确定是这样),所以代码将无法编译。
可能的解决方案:
所示,不要包含原始sigset_t为defined)
int sigaddset(sigset_t *set, int signo)
{
if (SIGBAD(signo))
{
errno = EINVAL;
return(-1);
}
set->bits |= 1 << (signo - 1);
return 0;
}发布于 2012-03-06 21:24:21
修复代码。
按位&和|运算符要求两端都是整数(两个整数操作数)。
您似乎正在(重新)实现标准库函数。因此,您必须了解sigset_t类型的内部结构,但不清楚它的类型是什么。如果您不知道该类型的细节是什么,那么就没有必要重新实现这些函数。
在Mac上,如果您足够深入地跟踪系统头文件,就会发现sigset_t是一个__uint32_t,因此上面的代码看起来应该可以工作。如果sigset_t在您的机器上实际上不是一个整数,那么您的代码将失败,并出现与您得到的错误类似的错误。因此,除非你正在实现这个库,否则你应该保持独立,使用这个库提供的东西,而不是编写你自己的标准函数的盗版。
https://stackoverflow.com/questions/9584428
复制相似问题