我根据下面的代码尝试使用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 %d\n", oInfo.si_signo, oInfo.si_errno,oInfo.si_code),oInfo.si_code) ;
break;
}
}
}
答案 0 :(得分:3)
我认为你可能会错过一些逻辑。如果您得到的错误返回-1,但errno
不 EAGAIN
,您似乎认为它有效并且oInfo
变量包含有效数据。
如果您的流程在等待期间中断,这可能会导致问题,因为one of the valid return codes为EINTR
。
在这种情况下,当您输入该功能时,oInfo
将包含堆栈中的垃圾,事实证明我很确定信号不会达到4714397: - )
简单的查找方法:在默认情况下打印iRet
和errno
。
你的行也有一些可怕的错误:
printf( "Caught unexpected signal %d, error %d, code %d\n",
oInfo.si_signo, oInfo.si_errno,oInfo.si_code),oInfo.si_code) ;
但是我会认为这只是你的一个错字,它真的是这样的:
printf ("Caught unexpected signal %d, error %d, code %d\n",
oInfo.si_signo, oInfo.si_errno, oInfo.si_code);
我要做的改变是:
printf ("Caught unexpected signal %d, error %d, code %d, errno %d, iret %d\n",
oInfo.si_signo, oInfo.si_errno, oInfo.si_code, errno, iRet);