дочерний процесс зависает при чтении из stdin (состояние гонки fork / dup2)?

У меня есть процесс, который разветвляется для выполнения подпроцесса, который получает запись от стандартного ввода и пишет в стандартный вывод.

Мой код вкратце выглядит следующим образом:

int fd[2];
int fd2[2];
if (pipe(fd) < 0 || pipe(fd2) < 0)
throws exception;

pid_t p = fork();
if (p == 0) // child
{
close(fd[0]); //not needed
dup2( fd[1],STDOUT_FILENO);
dup2( fd[1],STDERR_FILENO);
close(fd2[1]); //not needed

//what if  write calls on parent process execute first?
//how to handle that situation
dup2( fd2[0],STDIN_FILENO);
string cmd="./childbin";

if (execl(cmd.c_str(),(char *) NULL) == -1)
{
exit (-1);
}
exit(-1);
}
else if (p > 0) // parent
{
close(fd[1]); //not needed
close(fd2[0]);
if (write(fd2[1],command.c_str(),command.size())<0)
{
throw exception;
}

close(fd2[1]);

//waits for child to finish.
//child process actually hangs on reading for ever from stdin.
pidret=waitpid(p,&status,WNOHANG))==0)

.......

}

Дочерний процесс по-прежнему ждет данных в STDIN. Может ли быть состояние гонки между дочерним и родительским процессом? Я думаю, что это может быть проблемой, но не совсем уверен, а также не уверен, как это исправить.

Заранее спасибо.

Обновить:
Некоторая полезная информация.
Родительский процесс — это демон, и этот код выполняется несколько раз в секунду. Это работает в 97% случаев (~ 3% случаев, дочерний процесс остается в состоянии, описанном ранее).

ОБНОВЛЕНИЕ 2
После добавленной проверки в вызове dup2 там нет ошибки, следующее условие никогда не возникает.

if(dup2(...) == -1) {
syslog(...)
}

0

Решение

Вы пропустили Подождите вот почему вы в 3% случаев управляете родителем раньше ребенка. Смотрите пример внизу.

Также вам следует позвонить close на ФД вы не используете, прежде чем делать что-либо еще.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector