- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试根据下面的代码使用 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 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);
关于linux sigtimedwait 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816462/
我应该实现一个信号处理程序,它在第一次调用某个信号时停止程序中的所有线程,如果它们已经停止则恢复它们。我使用以下代码实现了在后台运行的恶魔线程: void *handle_sig(void *arg)
我尝试根据下面的代码使用 sigtimedwait,我收到此消息“捕获意外信号 4714397,错误 0,代码 370078816”。有谁知道我在哪里可以找到这些号码对应的 map ? sig
我的程序有一个受 epoll 约束的事件循环(用于 I/O)和条件变量(用于其他消息事件),以及负责捕获信号的工作线程(SIGINT、SIGTERM、SIGHUP)。 SIGINT , SIGTERM
我正在尝试学习如何使用 sigtimedwait(),但我发现它并没有等待超时完成。下面它似乎比它应该更快地返回 EAGAIN 4 秒(每 1 分钟超时快 1 秒): #include #inclu
我最近一直在研究 Linux 上的信号处理,并阅读了所有与信号处理相关的概念。一个困扰我的问题是,为什么在进程畅通无阻时,sigtimedwait() 集合中的信号没有被传递。我的代码如下:- #in
我在 sigtimedwait () 发生崩溃,一旦在运行无限时间的线程函数中运行下面所述的代码块。在运行于 debian 9.3 上的应用程序中使用 sigtimedwait 来查找 SIGUSR1
我在 FreeBSD 上使用 sigtimedwait() 捕获 SIGCHLD 信号时遇到问题。以下源代码在 Debian GNU/Linux 7 上运行良好,但为我提供了在 FreeBSD 9.1
我是一名优秀的程序员,十分优秀!