2015-06-25 3 views
0

Я использую C++ 11 и linux. Я пытаюсь запустить несколько команд ssh с помощью fork() и popen() и отслеживать, когда команда ssh перестает работать. Когда я убиваю команду ssh на другом компьютере, он, похоже, не убивает дочерний процесс fork(), который его запустил. Детский процесс продолжается, пока я не выйду из программы. Что мне нужно сделать, чтобы убить дочерний процесс, когда команда ssh, вызванная с запуском popen(), запущена? Есть ли что-то лучшее, что я мог бы использовать для этого, чем popen(), чтобы вызвать команду ssh?убить подпроцесс, если proc

+0

запустить программу в gdb и поймать сигнал, который возникает при удалении оболочки удаленного узла. Я не помню сигнал, который будет поднят. – Pradheep

+0

И как именно я это сделал? – user1620479

+0

в оболочке gdb yourprogramname – Pradheep

ответ

-1

дочерний процесс должен периодически запрашивать статус идентификатора процесса ssh и основываться на ответе, который вы возвращаете, решите его убить или нет. вы можете использовать getppid() для получения родительского идентификатора. После получения идентификатора процесса. Вы можете проверить, если он активен или нет с помощью ниже сценария

if ps -p $PID > /dev/null 
then 
    # pid is active do something 
fi 
+0

Как запросить статус команды ssh? – user1620479

+0

Я использую kill (pid, 0), чтобы сообщить мне, работает ли он еще. Даже после того, как я убил команду ssh на другом компьютере, процесс все еще говорит о ее запуске. Поэтому я все еще не уверен, как определить, завершилась ли команда ssh – user1620479

+0

«на другом компьютере». Если это означает, что ребенок работает на другом компьютере, вам необходимо отправить сигнал об уничтожении на этот компьютер. –

1

Вам нужно позвонить wait или waitpid для того, чтобы O/S для удаления дочернего процесса. Завершенный дочерний процесс, который не получил статус, полученный его родителем wait, становится процессом «зомби».

Если вы не заинтересованы в статусе дочернего процесса, но только хотите, чтобы они очищены, вы можете установить обработчик сигнала для SIGCHLD, который будет срабатывать всякий раз, когда один из вашего ребенка процессов заканчиваются, и вызвать wait в обработчике «пожинать» ребенка.

+0

Итак, добавьте команду wait() после popen() в дочернем процессе? – user1620479

+0

@ user1620479: если вы имеете в виду wait() сразу после popen() в родительском процессе, да. wait() блокирует вызывающего, однако, это может быть не то, что вы хотите: если родитель не читает выходные данные дочернего процесса, ребенок в конечном итоге зависает из-за полного вывода буферов. Таким образом, обработчик сигналов может быть тем, что вам нужно. –

+0

@ user1620479: Если у вас есть еще одна положительная индикация того, что дочерний процесс мертв (например, файловый дескриптор для его stdout закрыт), вы можете вызвать wait или waitpid, а затем, чтобы пожинать ребенка. –

Смежные вопросы