我有一个分叉的进程来执行一个子进程,它从stdin接收一个条目并写入stdout。
简而言之,我的代码如下:

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(...)
}

最佳答案

你缺少await这就是为什么在3%的案例中,你会在孩子之前运行父母。见下面的例子。
另外,在做其他事情之前,你应该在你不使用的fd上调用close

关于c++ - 从标准输入读取时子进程挂起(fork/dup2竞争状况)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51601257/

10-16 20:38