#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()函数
Data Type: sigset_t
The sigset_t data type is used to represent a signal set. Internally, it may be implemented as either an integer or structure type.
For portability, use only the functions described in this section to initialize, change, and retrieve information from sigset_t objects—don't try to manipulate them directly.
编辑:这里是我的想法。你可能试图编译从某处(一本书,开源等)复制的代码。这些函数已经存在于库中,不应该被重写。但是,如果你真的想这样做,那么请记住原始代码编写者假定sigset_t是一个整数或整数类型,而不是结构。
由于在系统中你正在用sigset_t编译可能(而且我很确定它是)定义为一个结构,所以代码不会编译。
可能的解决方案:
- 重新定义sigset_t作为一个整数(不包括在原始sigset_t的定义的系统头)在
- 变化的代码编译与定义sigset_t,像下面的例子(超级危险)。
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
在您的机器上实际上不是一个整数,那么您的代码将失败,错误类似于您所得到的。所以,除非你的是实现库,你应该保持良好的状态并使用库提供的内容,而不是编写你自己的标准函数的盗版版本。
- 1. 无效的操作数为二进制“|”
- 2. 无效操作数为二进制
- 3. 无效操作数为二进制*
- 4. 无效的操作数到二进制==
- 5. “无效操作数的二进制表示”错误
- 6. 对二进制无效的操作数==错误
- 7. NSTimer - 二进制%错误的操作数无效
- 8. 错误:“无效的二进制操作数/”
- 9. 错误:无效的操作数为二进制+(有'浮动*'和'浮动*')
- 10. 错误:无效的操作数为二进制*指向矩阵的指针
- 11. 升压multi_index例如:错误:无效的操作数为二进制表达
- 12. 无效的操作数为二进制*(有'INT'和'INT *')
- 13. 无效的操作数为二进制*(有'双*'和'双*')
- 14. 无效的二进制操作符^
- 15. 出错无效操作数的二进制表示用C
- 16. 指针,无效操作数为二进制,和菜鸟
- 17. 错误:对二进制转换无效的操作数(bitset <8>和int)
- 18. 迭代:无效的操作数为二进制表达
- 19. 什么是错的错误:无效的操作数为二进制表达式(“双”和“双师型”)
- 20. Objective-C编译错误:对二进制表达式无效的操作数
- 21. 无效的操作数类型'双'和'双'到二进制'操作符%'
- 22. 如何解决错误...类型'int'和'float'的无效操作数到二进制'操作符%'?
- 23. 对二进制表达式无效的操作数('NSMutableArray'和'double')
- 24. 无效操作数的二进制表示(“浮动*”和“浮动*”)
- 25. C++:无效的操作数到二进制表达式
- 26. 无效的操作数到二进制表达式
- 27. 我不断收到此错误:无效的操作数为二进制^(有“双重”和“双”)
- 28. 类型的无效操作数int和double二进制“操作符%”
- 29. Objective-C的无效操作数的二进制表示
- 30. 替换算法C++无效操作数的二进制表示
你为什么要做手动信号位处理?那肯定有系统宏呢? – 2012-03-06 13:17:57
那么,对于初学者,你可以停止将不透明类型视为整数。 – tbert 2012-03-06 13:19:39
你从哪里拿这段代码? mm我认为他在编译现有代码(linux内核?)方面存在问题。他可能只是需要正确的编译器选项。 – vulkanino 2012-03-06 13:25:40