Вешать дочерний процесс - PullRequest
       5

Вешать дочерний процесс

1 голос
/ 18 февраля 2009

Я пытаюсь протестировать свою систему и хочу имитировать условие, при котором дочерний процесс зависает. Для этого я пытаюсь присоединить дочерний процесс к GDB и сделать перерыв. Но все идет не так, как ожидалось.

Кроме того, в том же духе, откуда мне знать, что порожденный дочерний процесс не прогрессирует, а зависает?

Ответы [ 2 ]

1 голос
/ 18 февраля 2009

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

Чтобы проверить, что дочерний процесс не завис, вы должны отправить его сердцебиение родителю (для этого вам понадобится какой-то канал связи - возможно, как минимум stdin / stdout). Затем ребенок повесился, если ему не удалось отправить пару сообщений о сердцебиении.

0 голосов
/ 27 февраля 2009

Дочерний процесс унаследует все каналы, созданные до разветвления. Вы можете использовать это, чтобы «повесить» своего ребенка и дать ему знать, когда продолжить. Вы можете сделать так, чтобы ваш дочерний процесс попытался заблокировать чтение в канале, и он будет блокироваться (то есть зависать), пока родительский объект что-то не напишет.

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

Примеры обоих из них можно найти в FAQ по программированию Unix вместе с тонной дополнительной информации об управлении процессом, обработке сигналов, каналах и т. Д. ...

Вы можете попробовать заглянуть в / proc, чтобы определить, зависли ли вы. Вы можете прочитать / proc / / stat, чтобы получить много низкоуровневой информации о процессе, включая текущее состояние, количество времени пользователя / ядра, на которое процесс был запланирован, текущий стек и указатели команд и т. Д. .. Используя комбинацию этого, вы можете попытаться определить, завис процесс или нет. Посетите справочную страницу proc (5) для получения дополнительной информации о /proc//stat.

...