2017-03-03 3 views
1

パイプを使用して、あるコマンド/プログラムのstdinを別のコマンド/プログラムstdoutにリダイレクトするCプログラムを作成する必要があります。コマンドラインのプログラムに./a.out ls -l \; moreが渡された場合は、標準出力ls -lmoreにリダイレクトし、\;を区切り文字にしてください。このプログラムは、私たちのパスにあるコマンド/プログラムのために動作するはずです:./a.out cat filename.c \; moreは、入力したものと同じでなければなりません:cat filename.c | more1つのプログラムのstdoutを別のプログラムのstdinにリダイレクトするパイプ

私の問題は、私のプログラムが正しく実行されていないか、パイプが期待どおりに動作していないことです。基本的には、私が置いたprint文のデバッグ以外の出力は得られません。具体的には、プログラムは、Exec ...とERRORを印刷します。これはすべて親コード内にあります。子供で

#include <fcntl.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <unistd.h> 
    #include <sys/types.h> 
    #include <sys/wait.h> 
    void pipeit(char * pro1, char * pro2, char * p1args[], char * p2args[]) 
    { 
    pid_t pid; 
    int fd[2]; 
    int st; 
    pipe(fd); 
    pid = fork(); 

    if(pid < 0) 
    { 
     printf("Error Forking...\n"); 
     exit(-1); 
    } 
    else if(pid == 0) 
    { 
     dup2(fd[1],1); 
     close(fd[0]); 
     close(1); 
     printf("Exec 1...\n"); 
     execv(pro1, p1args); 
     printf("ERROR\n"); 
    } 
    else 
    { 
     waitpid(pid,&st,0); 
     if(st<0) 
     { 
      printf("Child Error\n"); 
     } 
     dup2(fd[0],0); 
     close(fd[1]); 
     close(0); 
     printf("Exec...\n"); 
     execv(pro2,p2args); 
     printf("ERROR\n"); 
    } 
    return; 
    } 
    /* THIS IS JUST COMMAND LINE PARSING */ 
    int main(int argc, char * argv[]) 
    { 
    int i = 1; 
    char * pro1; 
    char * pro2; 
    char * first[argc+1]; 
    char * second[argc+1]; 
    while(i<argc && argv[i][0] != ';') 
    { 
     if(i == 1) 
     { 
      pro1 = argv[i]; 
     } 
     else 
     { 
      first[i] = argv[i]; 
     } 
     i++; 
    } 
    first[i] = NULL; 
    while(i<argc) 
    { 
     if(argv[i][0] == ';') 
     { 
      i++; 
      pro2 = argv[i]; 
     } 
     else 
     { 
      second[i] = argv[i]; 
     } 
     i++; 
    } 
    second[i] = NULL; 
    pipeit(pro1,pro2,first, second); 
    return 0; 
    } 

答えて

0

、あなたが持っている:

dup2(fd[1],1); 
    close(fd[0]); 
    close(1); 

これは標準出力にパイプを複製したが、その後、標準出力を閉じます。標準出力を閉じずに、パイプの両端を閉じて修正します。経験則:パイプの一端を標準入力、出力、またはエラーに複製する場合、元のパイプ記述子の両方を閉じる必要があります。

dup2(fd[1],1); 
    close(fd[0]); 
    close(fd[1]); 

標準入力を閉じた状態で親にも同様の問題があります。

また、wait()が間違った場所にあります。プロセスは同時に実行する必要があります。パイプラインの最初のプロセスが非常に多くのデータを生成し、パイプがそれを保持できない場合、プロセスはブロックされます。他のプロセスが最初のプロセスが何かを読み取る前にプロセスが終了するのを待っている場合は、うまく動作しません。

関連する問題