LINUX.ORG.RU

Невыполнение exit()


0

0

У меня случается очень странная ситуация. Есть мультитредовая программа, работающая под LinuxThreads (NPTL не обсуждается). В ней есть обработчик Ctrl-C (SIGINT). Из этого обработчика зовется сначала pthread_cancel() для некоторых тредов, а затем exit(). Main-тред что-то печатает в цикле, и в это время пользователь нажимает Ctrl-C. В моем случае SIGINT всегда обрабатывается в main треде - это видно по PID-у. Вопреки всем ожиданиям, после вызова exit() main продолжает работу, которая была прервана по Ctrl-C! Все остальные потоки, кроме менеджера, умирают. То есть лог выглядит примерно так:

[pid 13801] Starting...
Running the runner 1
The runner 1 is working
The runner 1 is working
[pid 13801] The main thread is working
The runner 1 is working
The runner 1 is working
[pid 13801] The main thread is working
[pid 13801] SIGINT caught
[pid 13801] Killing threads... done
[pid 13801] calling exit...
[pid 13801] The main thread is working
[pid 13801] The main thread is working
[pid 13801] The main thread is working
[pid 13801] The main thread is working
[pid 13801] The main thread is working

Как же такое может быть?? У меня, честно говоря, ум за разум заходит... :(


У меня есть подозрения, что сигнал обрабатывается не в "базовой" ните процесса, а когда у тебя работает другая нить - к сожалению, как я понял, сигналы не очень хорошо согласуются с нитями...

Поэтому с обработчиком сигналов прийдется повозится - я сам такое не делал - мне проще было, сервер был - и там предупреждал сигналы неблокирующими сокетами - иначе бы пришлось очень сильно помучаться с перехватом сигналов и корректной обработкой...

Можешь попробовать в main сделать разделяемую atomic_t, и проверять в цикле менеджера, надо ли действительно выйти - и там выйти.

Spectr ★★★
()

> Как же такое может быть?? У меня, честно говоря, ум за разум заходит... :(

В 2.4 вообще нити интересные... Особенно с их убийством весело... И семафоры не работают, как надо...

В 2.6 вроде намного лучше (наконец-то POSIX) - буду скоро пробовать. Только с 2.6 на ядре 2.4, если в 2.6 они уже по стандарту, то на 2.4 работать корректно не будут :)

Spectr ★★★
()
Ответ на: комментарий от Spectr

В RedHat'овских ядрах, начиная, по-моему, с 2.4.20 есть NPTL, там все более-менее клрректно работает.

AVI
()

Из signal handler нельзя вызывать exit().
Вызывай _exit().
Хотя с LinuxThreads, которые никакому стандарту не соответствуют, и это может не помочь :-(

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.