2016-05-12 9 views
0

このプログラムと同じディレクトリにあり、下の行を含むbashスクリプト(sc.sh)の出力をCプログラム(cprog)の入力に入れたいと思います。 ; cprog作品を実行するが、bashスクリプトが開始されていない理由を私は知らない。フォークexecとbashスクリプト付きパイプ

timeout 5 cat /dev/urandom 

、これがメインプログラムである:

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

int main(int argc, char* argv[]) 
{ 
    int fd[2]; 
    pid_t pid1, pid2; 
    char * input[] = {"/bin/bash", "sc.sh", argv[1], NULL}; 
    char * output[] = {"./cprog", argv[1], NULL}; 

    pipe(fd); 

    pid1 = fork(); 
    if (pid1 == 0) { 
     dup2(fd[1], STDOUT_FILENO); 
     close(fd[0]); 
     execv(input[0], input); 
     return 1; 
    } 

    pid2 = fork(); 
    if (pid2 == 0) { 
     dup2(fd[0], STDIN_FILENO); 
     close(fd[1]); 
     execv(output[0], output); 
     return 1; 
    } 

    close(fd[0]); 
    close(fd[1]); 
    waitpid(pid1, NULL, WNOHANG); 
    waitpid(pid2, NULL, WNOHANG); 
    return 0; 
} 
+2

Szymonでは、インデントの使用を検討する必要があります。 :) – ZbyszekKr

+1

関数呼び出しの戻り値を確認する必要があります。 –

+1

'bash -c'が必要です。 – EOF

答えて

1

私はエラーを報告するようにプログラムを修正して、実際に子どもたちを待ちます、死ぬことをとても似:

#include <stdio.h> 
#include <sys/wait.h> 
#include <unistd.h> 

int main(int argc, char* argv[]) 
{ 
    if (argc > 2) 
     fprintf(stderr, "Excess arguments ignored\n"); 
    int fd[2]; 
    pid_t pid1, pid2; 
    char * input[] = {"/bin/bash", "sc.sh", argv[1], NULL}; 
    char * output[] = {"./cprog", argv[1], NULL}; 

    pipe(fd); 

    pid1 = fork(); 
    if (pid1 == 0) { 
     dup2(fd[1], STDOUT_FILENO); 
     close(fd[0]); 
     close(fd[1]); 
     execv(input[0], input); 
     perror(input[0]); 
     return 1; 
    } 

    pid2 = fork(); 
    if (pid2 == 0) { 
     dup2(fd[0], STDIN_FILENO); 
     close(fd[0]); 
     close(fd[1]); 
     execv(output[0], output); 
     perror(output[0]); 
     return 1; 
    } 

    close(fd[0]); 
    close(fd[1]); 
    int status1; 
    int corpse1 = waitpid(pid1, &status1, 0); 
    printf("PID %d: %d (0x%.4X)\n", pid1, corpse1, status1); 
    int status2; 
    int corpse2 = waitpid(pid2, &status2, 0); 
    printf("PID %d: %d (0x%.4X)\n", pid2, corpse2, status2); 
    return 0; 
} 

私はcprogような単純なCプログラムを使用しました

$ bash sc.sh | cprog 
sum of bytes: 325895667 
num of bytes: 69926912 
$ 

は(それがp19p19.cから作成された)は、メインプログラムを実行得た:コマンドラインで

#include <stdio.h> 

int main(void) 
{ 
    int c; 
    unsigned sum = 0; 
    unsigned cnt = 0; 
    while ((c = getchar()) != EOF) 
     sum += c, cnt++; 
    printf("sum of bytes: %u\n", sum); 
    printf("num of bytes: %u\n", cnt); 
    return 0; 
} 

テスト得

$ ./p19 
sum of bytes: 372818733 
num of bytes: 70303744 
PID 28575: 28575 (0x7C00) 
PID 28576: 28576 (0x0000) 
$ 

終了ステータスがtimeoutステータスで終了することを示します124は、コマンドがタイムアウトしたときに終了ステータスとしてGNUのドキュメントです。

私の環境を再現するにあたって、提供したコードは正常に動作します。それはあなたの環境があなたのように設定されていないことを示唆しています。たぶんsc.shスクリプトがありません。

+0

ありがとう、私はこれらのファイル記述子を閉じて、cprogを書き直すことによって問題を解決することができました。あなたのコードは本当に役に立ちました。 – Szymon

関連する問題