2013-11-29 2 views
2

У меня есть поток в настоящее время остановлен pselectpthread_kill возвращает номер ошибки 11

(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.

+1

У вас есть googled для чего-то вроде posix или pthreads коды ошибок? я бы поспорил, что есть что-то найти в tehir docs – dhein

+0

@Zaibis Я сделал это, но не нашел подсказки. Исходная страница Posix man содержит только 2 описания ошибок, ESRCH и EINVAL. И это не мое дело. – oyss

ответ

1

EAGAIN недокументированная Linux код возврата для pthread_kill() (реализованный в терминах tgkill() на Linux), что означает, что the receiving real-time signal queue has overflowed.

Я предполагаю, что вы замаскировали сигнал и отправили тысячи его до звонка до pselect(). В моей системе я наблюдаю это поведение, компилируя с -pthread и отправляя чуть более 15202 экземпляров сигнала в реальном времени.

+0

Спасибо за ваш ответ, но я еще не нашел решение. Я перезапустил свою систему, и проблема исправлена. Мне не удалось найти настоящую причину этого. Если сигнал в реальном времени очередь переполнена, как очистить ее или если есть механизм восстановления? – oyss

+0

@oyss, я думаю, вы случайно сигнализируете неправильную нить вместо потока pselect(). (Например, ваша подстановка 'raise()' будет сигнализировать вызывающий поток.) – pilcrow

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 
+0

рейз эквивалентен pthread_kill (pthread_self(), sig); и принимает только один аргумент. Я попытался поднять и вернул тот же самый errno 11. – oyss

Смежные вопросы