2016-12-07 4 views
0

パイプを通って外部プログラムにSTDINデータを使用する方法:私はこのメインプログラム持って

char data[1024]="Hello World!"; 
int main(int argc,char *argv[]) 
{ 
    pid_t pid; 
    int f1[2]; 
    pipe(f1); 
    if((pid=fork())==0) 
    { 
     close(f1[1]); 
     dup2(f1[0], STDIN_FILENO); 
     if((execlp("./2","./2",NULL))==-1) printf("error"); 
     close(f1[0]); 
    } 
    else 
    { 
     close(f1[0]); 
     dup2(f1[1],STDOUT_FILENO); 
     write(f1[1], data, sizeof(data)); 
     close(f1[1]); 
     wait(NULL); 
    } 
    return 0; 
} 

と2.Cプログラムを:私はデータIを使用したい場合は

int main(int argc,char *argv[]) 
{ 
    char DATA[1024]; 
    //sprintf(DATA,"J'ai lu %s",argv[1]); 
    //read(0,DATA,sizeof(DATA)); 
    int taille=strlen(DATA); 
    int i; 
    for(i=0;i<taille;i++) 
    { 
     if(DATA[i]=='c') 
     { 
      printf("found"); 
     } 
    } 
} 

子供が実行するプログラムで親によってSTDOUTに書き込むと、execプログラムのSTDINから読み込む必要がありますか、execlpの引数としてデータを渡す必要がありますか?それとも別の何か?

+0

あなたが書いている、親プログラムにstdout' 'への書き込みをしていませんパイプに接続します。しかし、あなたは子供の 'stdin'から読む必要があります。 – Barmar

+0

ちょうど間違いのコピー、申し訳ありません。それを修正! – Amine

+0

あなたはまだ 'STDOUT_FILENO'ではなく' f1 [1] 'に書いています。 – Barmar

答えて

0

パイプをSTDIN_FILENOに複製するので、親プログラムでパイプに書き込む内容を取得するには、子プログラムでstdinを読む必要があります。

また、への電話の前に、を呼び出す前に、の電話をに移動する必要があります。 execが成功した場合、元のプログラムの実行後は何も実行されません。

そして、あなたは子プログラムで出力を確認したい場合は、Hello World!でのキャラクターのためになるはずです。

if (DATA[i] == 'o') { 
    printf("found\n"); 
} 
+0

それは私がやったことですが、子プログラムの標準入力から読みました。プログラム自体を実行するとうまくいきますが、メインプログラムを使用しても何も起こりません。 – Amine

+0

Hello Worldには 'c'がありません。 – Barmar

+0

ありがとう、ありがとう。 – Amine