1

Linuxでこのdup2コマンドを試しています。私は次のようにコードを書きました:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
    int pipe1_ends[2];
    int pipe2_ends[2];
    char string[]  = "this \n is \n not \n sorted";
    char buffer[100];
    pid_t pid;

    pipe(pipe1_ends);
    pipe(pipe2_ends);

    pid = fork();


    if(pid > 0) { /* parent */

        close(pipe1_ends[0]);
        close(pipe2_ends[1]);

        write(pipe1_ends[1],string,strlen(string));
        read(pipe2_ends[0], buffer, 100);   
        printf("%s",buffer);
        return 0;
   }

   if(pid == 0) { /* child */
       close(pipe1_ends[1]);
       close(pipe2_ends[0]);
       dup2(pipe1_ends[0], 0);
       dup2(pipe2_ends[1],1);
       char *args[2];
       args[0] = "/usr/bin/sort";
       args[1] = NULL;
       execv("/usr/bin/sort",args);    
   }
  return 0;
}

私は、このプログラムが次のように動作することを期待しています: 子をフォークし、そのイメージを並べ替えプロセスに置き換える必要があります。また、stdin と stdout は dup2 コマンドに置き換えられているため、sort がパイプから入力を読み取り、出力を親によって出力される他のパイプに書き込むことを期待しています。しかし、ソートプログラムは入力を読み取っていないようです。コマンドライン引数が指定されていない場合、ソートは標準入力からそれを読み取りますか? 誰かがこの問題を手伝ってくれませんか。

どうもありがとう!

4

1 に答える 1

1

うーん。子プロセスにデータを送信した後、pipe1_ends[1] を閉じるか呼び出しshutdown(2)て、書き込みが完了したことを伝える必要があります。また、ループ内で write/read を呼び出す必要があります。これは、一般的なケースでは、少なくとも read が一度にすべての結果を取得できない可能性が非常に高いためです。明らかに、完全なコードはすべての戻り値をチェックしますね。

最後に 1 つ: printf がひどく壊れています。null で終了する文字列のみを受け入れることができ、 によって返される結果はreadnull で終了しません (これは長さのあるバッファーであり、末尾がどこにあるかを知るためのもう 1 つの一般的な方法です)。あなたがしたい:

int n = read(pipe2_ends[0], buffer, 99);
if (n < 0) { perror("read"); exit(1); }
buffer[n] = 0;
printf("%s",buffer);
于 2013-05-21T18:12:52.233 に答える