Я пишу программу на C на Linux, которая включает в себя модуль, который
позволяет выполнять команду оболочки на удаленной машине.
Самый простой способ на самом деле выполнить команду, конечно, было бы
просто используйте функцию system (), или используйте popen, а затем возьмите
выход. Однако я решил использовать более низкоуровневый подход из-за других требований к дизайну, которые не имеют отношения к текущему
проблема.
Итак, я установил трубу и вилку, а затем вызвал execl. Это все
работает отлично, за исключением одного досадного исключения. Не работает
правильно, если выполняемая команда оболочки является демоном. В этом
дело, это просто висит. Я не могу понять, почему. Мое понимание
что, когда демон запускается, он обычно разветвляется, а затем родитель выходит. Поскольку мое приложение имеет открытый канал к родителю, вызов
read () должен потерпеть неудачу, когда родитель выходит. Но вместо этого
приложение просто зависает.
Вот некоторый код, который воспроизводит проблему:
int main(int argc, char** argv)
{
// Create a pipe and fork
//
int fd[2];
int p = pipe(fd);
pid_t pid = fork();</p>
<pre><code> if (pid > 0)
{
// Read from the pipe and output the result
//
close(fd[1]);
char buf[1024] = { 0 };
read(fd[0], buf, sizeof(buf));
printf("%s\n", buf);
// Wait for child to terminate
int status;
wait(&status);
}
else if (pid == 0)
{
// Redirect stdout and stderr to the pipe and execute the shell
// command
//
dup2(fd[1], STDOUT_FILENO);
dup2(fd[1], STDERR_FILENO);
close(fd[0]);
execl("/bin/sh", "sh", "-c", argv[1], 0);
}
}
Код работает нормально, если вы используете его с обычной командой оболочки. Но если
вы пытаетесь запустить демон, он просто зависает, а не возвращается к
подскажите как следует.