在《UNIX高级环境编程》(第二版)第241页中,有关于signal 与 SIG_ERR的定义:
void (*signal (int signo, void (*func)(int)) )(int); #define SIG_ERR (void (*)()) -1
在程序清单10-1中,有这么一行代码:
if(signal(SIGUSER1, sig_usr) == SIG_ERR)
看到上面三行代码后,看书认真的同学肯定有疑问,SIG_ERR的定义不对啊,SIG_ERR应该要有参数才对,SIG_ERR的定义应该:
#define SIG_ERR (void (*)(int)) -1
才对啊!
为此,我分别在VS2010与VIM环境下简单的写了几行代码来验证SIG_ERR是否有误。结果发现:
void (*signalTest (int signo, void (*func)(int)) )(int)
{
return NULL;
}
#define SIG_ERR_TEST (void (*)()) -1
void main()
{
if(signalTest(0,NULL)==SIG_ERR_TEST)
return;
}
这个程序在VS2010下编译通不过,但是在VIM下编译通过了。 并且,当我把验证程序改成: (修改了signalTest的参数)
void (*signalTest (int signo, void (*func)(int)) )(int,int )
{
return NULL;
}
#define SIG_ERR_TEST (void (*)()) -1
void main()
{
if(signalTest(0,NULL)==SIG_ERR_TEST)
return;
}
这个程序在VIM还是可以编译通过了。由此可见,文献[1]的解释是合理的。
Linux(Ubuntu10.04)环境下SIG_ERR的定义:
#typedef void (*__sighandler_t) (int);
#define SIG_ERR ((__sighandler_t) -1) /* Error return. */