我的线程目前已被pselect停止
(void)pselect(1, NULL, NULL, NULL, NULL, &select_mask);
sigmask以这种方式初始化。
(void)sigfillset(&select_mask);
(void)sigdelset(&select_mask, 37);
在gdb中调试
4 Thread 0x7ffff7fce710 (LWP 28287) 0x00007ffff6a24dab in pselect () from ./libc.so.6
当我尝试向此线程发送信号37以从pselect中取出它时。 它返回11.
(gdb) call pthread_kill(0x7ffff7fce710,37)
$26 = 11
尝试其他信号将返回0,因为其他信号应该被阻止。
(gdb) call pthread_kill(0x7ffff7fce710,3)
$27 = 0
11这意味着什么? EAGAIN? 如何摆脱它并结束那个pselect?
我使用64位suselinux 11系统。
答案 0 :(得分:2)
捕获pthread_kill的返回值并通过strerror
函数运行它。您将获得一个返回的字符串,其中包含指定的错误。
if ((error = pthread_kill(...)) != 0)
printf("pthread_kill error: %s\n", strerror(error));
此外,在尝试模拟您正在做的事情时,我遇到了类似的问题。我的解决方案是简单地使用info threads
和raise
,就像这样
(gdb) info threads
2 thread 1024621 thread () at main.c:7
* 1 thread 1025084 0x0fda2445 in _thread_sys___thrsleep () from /usr/lib/libc.so.65.0
(gdb) call raise(1, 37)
$1 = 0
(gdb) detach
答案 1 :(得分:1)
EAGAIN是pthread_kill()
的未记录的Linux返回代码(在Linux上以tgkill()
实现),意思是the receiving real-time signal queue has overflowed。
我的猜测是你在调用pselect()
之前屏蔽了信号并发送了数千个信号。在我的系统上,我观察到这种行为使用-pthread
进行编译,并发送了超过15202个实时信号实例。