0

PS、WC、grep などの UNIX コードを C コードに実装する必要があります。コードの各部分を実行する子を作成するパイプとフォークがありますが、毎回閉じる必要があるプロセスの数について少し混乱しています。これまでのコードは次のとおりですが、権利が閉じられていないため、明らかに機能しません。

int main() {
int pfd[2];
int pid;

if (pipe(pfd) == -1) {
    perror("pipe failed");
    exit(-1);
}
if ((pid = fork()) < 0) {
    perror("fork failed");
    exit(-2);
}
if (pid == 0) {
    close(pfd[1]);
    dup2(pfd[0], 0);
    close(pfd[0]);
    if (pipe(pdf) == -1) {
        perror("pipe failed");
        exit(-1);
    }
    if (pid ==0) {
        close(pfd[1]);
        dup2(pfd[0], 0);
        close(pfd[0]);
        execlp("wc", "wc", (char *) 0);
        perror("wc failed");
        exit(-3);
    }
    else 
        close(pfd[1]);
        dup2(pfd[0], 0);
        close(pfd[0]);
        execlp("grep", "grep" "1111", (char *) 0);
        perror("grep failed");
        exit(-3);
} 
else {
    close(pfd[0]);
    dup2(pfd[1], 1);
    close(pfd[1]);
    execlp("ps", "ps", "auxj", (char *) 0);
    perror("ps failed");
    exit(-4);
}
exit(0);
}

どんな助けでも素晴らしいでしょう

4

1 に答える 1

0

作成している fork されたプロセスの実行順序に保証はありません。これは、パイプを実際に閉じることができないことを意味します。そのためには、同期を追加して、パイプを使用するすべてのプロセスが終了するのを待ってから、最後のプロセスでそれらを閉じる必要があることを確認する必要があります。

于 2013-10-31T17:51:13.293 に答える