私は以下のコードに従ってsigtimedwaitを試してみます。このメッセージは "予期せぬシグナル4714397、エラー0、コード370078816"となっています。誰も私がそれらの番号の対応するマップを知ることができるか知っていますか?linux sigtimedwait issue
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;
}
}
}
ありがとうございます。私は "if(-1 == iRet && EAGAIN == errno)"を "if(-1 == iRet)"に変更した後、iRetとerrnoを出力しようとします。私はそれがエラーコード4(EINTR)を印刷し、次に11(EAGAIN)を見つけ、印刷EAGAINを維持することが分かった。実際にどのような状況で、EAGAINは放置されていますか? –
'[EINTR]待機は、ブロックされていない捕捉された信号によって中断されました。 'EAGAIN'シナリオのように' sigtimedwait'を引き続き呼び出すのではなく、すべてのものを再度設定しなければならないことを意味します。 – paxdiablo