2017-01-31 12 views
0

私はLinuxコマンド "ls -l | tail -n 2"をCコードの単純なパイプで実行しようとしています。linux terminalコマンドとCコードのパイプ

あなたのヒントを追加しましたが、これはうまくいきましたが、出力が正確にはそうではありません。出力を2行ではなく1行に出力し、ユーザー入力を閉じるのを待ちます。 は、ここに新しいコードです:

#include "stdio.h" 
#include "unistd.h" 
#include "stdlib.h" 
#include "sys/wait.h" 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

void main() 
{ 
    char line[100]; 
    pid_t pid; 
    int fd[2]; 
    int status; 
    char* ls_arguments[] = {"ls", "-l", NULL}; 
    char* tail_arguments[] = {"tail", "-n", "2", NULL}; 
    pipe(fd); 
    pid = fork(); 
    if(pid == 0)//ls client 
    { 
     close(1); 
     dup(fd[1]); 
     close(fd[0]); 
     execvp("ls", ls_arguments); 
    } 
    pid = fork(); 
    if(pid == 0)//tail client 
    { 
     close(0); 
    close(fd[1]); 
     dup(fd[0]); 
     execvp("tail", tail_arguments); 
    } 
    wait(pid, 0, WNOHANG); 
    close(fd[0]); 
    close(fd[1]); 
} 

このパイプ入力としてそれを取得し、実行します次の「尾」クライアントへの「ls -l」コマンドと出力を実行すべきである「テール-n 2」コマンドを実行して最終出力を出力しますが、端末は何も出力しません。どんな助け?すべての

+0

は、execvpの 'の後にコードを置くことにはポイント()'はありません。 – Barmar

+0

それぞれが 'exec'を呼び出す前に、' ls'クライアントで 'close(fd [0])'を、 'tail'クライアントで' close(fd [1]) 'を実行する必要があります。 – Barmar

+0

親プロセスは両方を閉じる必要があります。 – Barmar

答えて

1

まず、そこここでは、そのようwait関数ではありませんmanはこう言われる、

#include <sys/types.h> 
#include <sys/wait.h> 

pid_t wait(int *status); 

pid_t waitpid(pid_t pid, int *status, int options); 

は、私はあなたがwaitpidを使用するためのものだと思います。

次に、パイプがまだ親のどこかで開いているため、子プロセスが終了しません。実際には、まずディスクリプタを閉じて、子プロセスを待つ必要があります。私が書くでしょう:

close(fd[0]); 
    close(fd[1]); 
    wait(NULL); // Wait for the first child to finish 
    wait(NULL); // Wait fot the second one 
    return 0; 
} 

の代わりに:それは、エラーを取得しない限り、それは決して戻らないので、

wait(pid, 0, WNOHANG); 
    close(fd[0]); 
    close(fd[1]); 
} 
関連する問題