Поддерживать разветвленный процесс, если родительский / дочерний процесс завершается ненормально (C ++) - PullRequest
3 голосов
/ 11 мая 2011

Я пытаюсь выполнить другой процесс командной строки параллельно с текущим процессом.Тем не менее, я понимаю, что программа командной строки иногда ненормально завершается, и это также убивает мою основную программу.

// MAIN PROGRAM
pid = fork();
char *argv[] = { stuff.. };
if (pid == 0) {
    int rc = execv("command line program...", argv);
    }

// DO OTHER STUFF HERE. 

if (pid > 0) {
    waitpid(pid, 0, 0);
}

Есть ли способ сохранить работоспособность моей основной программы после того, как программа командной строки ненормально умерла?Спасибо!

[ОБНОВЛЕНИЕ]: Да, основной процесс пишет в файл, из которого читается командная строка, но это обычный файл, а не канал.Я получаю сообщение об ошибке.

Мне очень трудно воспроизвести ошибку, так как дочерний процесс не очень часто падает.Но это случается.Случайный сбой - это известная ошибка в программе командной строки, поэтому я хочу сохранить свою основную программу живой, даже если командная строка умрет.

Ответы [ 2 ]

1 голос
/ 11 мая 2011
  • Используйте vfork вместо fork, чтобы избежать ненужного клонирования процесса.
  • Убедитесь, что не происходит сбой при получении родительского процесса SIGCHLD.
  • Используйте правильное выражение if-then-else, чтобы прояснить, какой код выполняется в родительском процессе и что происходит в дочернем процессе.Например, очень вероятно, что и дочерний процесс и процесс выполнят код, где // DO OTHER STUFF HERE. комментарий в случае сбоя execv.
  • В конце концов, используйте gdb.Он скажет вам, где происходит сбой.
1 голос
/ 11 мая 2011

В вашем реальном коде у вас есть еще здесь:

if (pid == 0) {
    int rc = execv("command line program...", argv);
    // possibly more child stuff
}
else {
    // parent stuff
}

Всегда полезно размещать реальный код при задании вопросов здесь.

...