我试着根据下面的代码使用sigtimedwait,我得到了这个消息"捕获意外信号4714397,错误0,代码370078816"。有人知道我在哪里能找到这些数字的对应地图吗?
sigset_t oMask;
siginfo_t oInfo;
struct timespec oTimeout;
/* Create a mask holding */
sigemptyset(&oMask);
sigaddset(&oMask, SIGINT );
sigaddset(&oMask, SIGTERM );
/* Set the mask for our main thread to include SIGINT */
pthread_sigmask( SIG_BLOCK, &oMask, NULL );
/* Max wait for ^C set to 5 seconds */
oTimeout.tv_sec = 5;
oTimeout.tv_nsec = 0;
int iRet = -1;
bool bStop = false;
while (!bStop)
{
iRet = sigtimedwait(&oMask, &oInfo, &oTimeout);
if ( -1 == iRet && EAGAIN == errno)
{
}
else
{
switch (oInfo.si_signo)
{
case SIGINT:
printf( "Caught SIGINT in sigtimedwait( )n" );
bStop = true;
break;
case SIGTERM:
printf( "Caught SIGTERM in sigtimedwait( )n" );
bStop = true;
break;
/* Should never really get to default */
default:
printf( "Caught unexpected signal %d, error %d, code %dn", oInfo.si_signo, oInfo.si_errno,oInfo.si_code),oInfo.si_code) ;
break;
}
}
}
我想你可能遗漏了一些逻辑。如果你得到一个错误返回-1,但errno
是不是 EAGAIN
,你似乎假设它工作,oInfo
变量包含有效的数据。
如果您的进程在等待期间被中断,这可能会导致问题,因为其中一个有效的返回码是EINTR
。
在这种情况下,oInfo
将包含当您进入该函数时堆栈上的任何垃圾,这一事实证明,我非常确定信号不会达到4714397:-)
简单的方法来找出:打印出iRet
和errno
在你的默认情况下。
你的这一行也有一些可怕的错误:
printf( "Caught unexpected signal %d, error %d, code %dn",
oInfo.si_signo, oInfo.si_errno,oInfo.si_code),oInfo.si_code) ;
但是我假设这只是你的一个打字错误,它实际上是这样的:
printf ("Caught unexpected signal %d, error %d, code %dn",
oInfo.si_signo, oInfo.si_errno, oInfo.si_code);
我要做的改变是:
printf ("Caught unexpected signal %d, error %d, code %d, errno %d, iret %dn",
oInfo.si_signo, oInfo.si_errno, oInfo.si_code, errno, iRet);