хотите, чтобы поток не умер, когда родительский выход - linux - PullRequest
2 голосов
/ 07 сентября 2011

Я не хочу использовать fork (), потому что это добавляет уровень управления IPC, которого я хочу избежать.Я хотел бы использовать pthread.Я видел полоску для клона, и я не хочу начинать управлять потоком на уровне детализации clone ().

Чтобы дать им имена: A = основной поток, B = рабочий поток.

Я хочу, чтобы Б смог получить сигнал от А, когда А уходит.A может зарегистрировать atexit () для этого.

A может уйти либо от прерывания (), либо даже от SIGSEGV или другого сигнала терминала.Работа B заключается в ведении журналов: A и B совместно используют контейнер с сообщениями журнала, создаваемыми A. Если A умирает, я хочу, чтобы B завершил регистрацию и затем завершил работу.

Прямо сейчас, если A выходит, B выходит, и я теряю все, что осталось в очереди журналов.

Поэтому мой вопрос заключается в следующем: есть ли способ сделать B немного более устойчивым, чтобы онторчит и не умирает с А?

Ответы [ 3 ]

3 голосов
/ 07 сентября 2011

Вы, кажется, путаете потоков и процессов ;То, как вы это описываете, А - это процесс, а не поток.Когда вызывается abort() или встречается SIGSEGV, и A выходит, B - который является потоком, содержащимся в процессе A - также исчезает.Обойти это невозможно, поскольку B неразрывно связан с A. Если вы хотите, чтобы процесс пережил A, вы должны использовать fork и создать новый процесс.

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

2 голосов
/ 07 сентября 2011

Я думаю, что вы хотите создать поток как отсоединенный с помощью pthread_attribute.

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

показывает, как - просто выполните поиск вниз по запросу "detached" :)родитель, и вы можете делать то, что вы хотите с ним потом.

2 голосов
/ 07 сентября 2011

Вы можете установить обработчик как для atexit, так и для ожидаемых вами сигналов (в A), который помещает последнее сообщение «Я закончил здесь» в очередь регистрации, затем присоединяется к (ожидает) B перед выходомвесь процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...