pthread_kill返回错误号11

时间:2013-11-29 09:16:37

标签: c multithreading pthreads signals posix

我的线程目前已被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系统。

2 个答案:

答案 0 :(得分:2)

捕获pthread_kill的返回值并通过strerror函数运行它。您将获得一个返回的字符串,其中包含指定的错误。

if ((error = pthread_kill(...)) != 0)
    printf("pthread_kill error: %s\n", strerror(error));

此外,在尝试模拟您正在做的事情时,我遇到了类似的问题。我的解决方案是简单地使用info threadsraise,就像这样

(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个实时信号实例。