我有一个父进程,它派生了一个子进程。我为子进程的 stdin/out/err 创建管道,将父进程中另一端的 fds 存储为pipe[0]
, pipe[1]
, pipe[2]
.
我看到一个竞争条件,select()
由于数据准备就绪,将返回pipe[2]
,但随后数据准备就绪,pipe[1]
并且pipe[1]
的数据首先写入,if
因为pipe[1]
.
有没有办法让我避免这种竞争条件并保留关于子进程何时写信给他们的顺序?
以下是相关代码:
// pipe[0] = in of child
// pipe[1] = out of child
// pipe[2] = err of child
char buf[2048];
fd_set rfds;
while (keepRunning) {
FD_ZERO(&rfds);
FD_SET(pipe[1], &rfds);
FD_SET(pipe[2], &rfds);
int rc = select(pipe[2]+1, &rfds, NULL, NULL, NULL);
if (rc) {
if (FD_ISSET(pipe[1], &rfds)) {
write(1, buf, read(pipe[1], buf, sizeof(buf)));
}
if (FD_ISSET(pipe[2], &rfds)) {
write(2, buf, read(pipe[2], buf, sizeof(buf)));
}
} else if (rc == -1) {
perror("select()");
}
}