子プロセスをフォークした親プロセスがあります。子プロセスの stdin/out/err 用のパイプを作成し、親のもう一方の端の fds を , としてストアに渡しpipe[0]
ます。pipe[1]
pipe[2]
select()
データの準備ができているために will が返されるという競合状態が発生していますが、データの準備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()");
}
}