1

子プロセスをフォークした親プロセスがあります。子プロセスの stdin/out/err 用のパイプを作成し、親のもう一方の端の fds を , としてストアに渡しpipe[0]ます。pipe[1]pipe[2]

select()データの準備ができているために will が返されるという競合状態が発生していますが、データの準備pipe[2]ができてpipe[1]pipe[1]データが最初に書き込まれるのはifpipe[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()");
    }
}
4

0 に答える 0