Давайте предположим, что у нас есть код делает что-то вроде этого:Что делать, если exec() не работает?
int pipes[2];
pipe(pipes);
pid_t p = fork();
if(0 == p)
{
dup2(pipes[1], STDOUT_FILENO);
execv("/path/to/my/program", NULL);
...
}
else
{
//... parent process stuff
}
Как вы можете видеть, это создает трубу, разветвление и использовать трубу для чтения вывода ребенка (я не могу использовать popen
здесь, потому что Мне также нужен PID дочернего процесса для других целей).
Вопрос в том, что должно произойти, если в приведенном выше коде execv
не удается? Должен ли я вызвать exit() или abort()? Насколько я знаю, эти функции закрывают дескрипторы открытых файлов. Поскольку процесс fork
-ed наследует дескрипторы файла родителя, означает ли это, что дескрипторы файла, используемые родительским процессом, станут непригодными?
UPD
Я хочу подчеркнуть, что речь идет не о исполняемом нагруженной Exec() не удается, но сам EXEC, например, в случае, если файл, указанный первым аргументом, не найден или не является исполняемым.
Если вы не хотите путать поток управления, я бы рекомендовал exit() с известным кодом выхода на неудавшемся exec. – Petesh
Эй, ребята, но что, если 'exit()' тоже не удается? –
Я не думаю, что это должно быть проблемой: любые забавные вещи, которые происходят в функциях atexit, приведут к ненормальному завершению в худшем случае, иначе мы не будем контролировать его (выход никогда не возвращается). –