gpt4 book ai didi

linux sigtimedwait 问题

转载 作者:太空宇宙 更新时间:2023-11-04 09:07:32 25 4
gpt4 key购买 nike

我尝试根据下面的代码使用 sigtimedwait,我收到此消息“捕获意外信号 4714397,错误 0,代码 370078816”。有谁知道我在哪里可以找到这些号码对应的 map ?

    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;
}
}
}

最佳答案

我认为您可能在那里缺少一些逻辑。如果您收到错误返回 -1 但 errno 不是 EAGAIN,您似乎认为它有效并且 oInfo 变量包含有效数据。

如果您的进程在等待期间被中断,这可能会导致问题,因为 one of the valid return codesEINTR

在那种情况下,oInfo 将包含当您输入该函数时堆栈中的任何垃圾,我非常确定信号不会上升这一事实证实了这一点4714397:-)

找出答案的简单方法:在默认情况下打印出 iReterrno

您的线路还有一些可怕的错误:

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);

关于linux sigtimedwait 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com