Есть демон с двумя потоками: th1, th2. th2 читает сокет, используя read(2)
.
Если я убиваю демона с помощью SIGTERM
, th1 ловит и обрабатывает сигнал (устанавливает флаг завершения), после этого вызывается деструктор демона, он вызывает pthread_kill(th2, SIGTERM)
. Однако второй поток не получает SIGTERM
, поэтому он не уничтожается (когда сокет получает данные и выходит из read()
, он завершает выполнение, так как установлен флаг завершения).
Если я позвоню pthread_kill(th2, SIGUSR2)
, а затем pthread_kill(th2, SIGTERM)
, все завершится корректно. Таким образом, похоже, что UNIX не позволяет последовательно отправлять одинаковые сигналы.
Зависит ли такое поведение от операционной системы? Можем ли мы гарантировать, что указанный поток получит SIGTERM
из другого потока?
read()
? Чтобы отменить запущенный поток? Чтобы подать определенный сигнал? Убить весь процесс? - person pilcrow   schedule 04.08.2011