Как сигнал процесса влияет на его дочерние потоки? - PullRequest
2 голосов
/ 26 октября 2011

гуру, у меня 2 проблемы с функциями linux:

  1. sleep

    Насколько я знаю, сон в процессе будет прерываться любыми сигналами, посылаемыми его процессу,Это правильно?

  2. все еще спит

    Если я создаю несколько потоков в процессе, и я вставляю функции сна в потоки, а затем, если я отправляю сигналыбудет ли прерываться сон?

Кстати, если я отправлю сигнал процессу, когда процесс получит сигнал, он отправит его дочерним потокам?

Спасибо за ваши ответы

Ответы [ 4 ]

3 голосов
/ 26 октября 2011

1: сон, поскольку я знаю, что сон в процессе будет прерван любыми сигналами, посланными его процессу.это правильно?

Это будет прервано, если конкретный сигнал не будет проигнорирован или заблокирован с помощью sigprocmask.

2: все ещеSleep, если я создаю несколько потоков в процессе, и я вставляю функции Sleep в потоки, а затем, если я отправляю сигналы в процесс, будет ли сон прерываться?

Только один поток получаетсигнал посылается процессу, даже если в этом процессе есть несколько потоков, у которых этот сигнал разблокирован.См. Основные понятия сигнала для получения более подробной информации.Стандартный способ обработки сигналов в многопоточном процессе - блокировать все сигналы во всех потоках, кроме того, который обрабатывает сигналы (обычно это основной поток).

Кстати: если я отправляюсигнал процессу, когда процесс получит сигнал, отправит ли он своим дочерним потокам?

Не будет.

Однако, если процесс является сеансовой группойлидер, управляющий терминалом, его группа получит сигнал SIGHUP, когда лидер сеанса завершит работу.Кроме того, когда группа процессов становится осиротевшей, ее процессы отправляются SIGHUP, за которыми следует SIGCONT.

1 голос
/ 26 октября 2011

1: Да, верно. Если вы изучите errno после sleep(), то будет установлено значение EINTR (прервано).

2: Каждый поток может установить свою собственную маску сигнала, используя pthread_sigmask(), и если он блокирует сигнал, он не будет отправлен. Однако не определено, какой из потоков получает сигнал, если они не блокируют сигнал явно.

Однако вы можете отправить сигнал непосредственно в определенный поток, используя pthread_kill().

0 голосов
/ 26 октября 2011

Сигнал, направленный на процесс, доставляется на один потоков процесса. Если эта нить спит, она будет разбужена.

0 голосов
/ 26 октября 2011
  1. Вы должны использовать условие ожидания вместо сна.

https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview

Вам нужно только прочитать раздел «Переменные условия».Это поможет вам получить обзор pthread для ваших целей.

...