2017-04-01 7 views
0

私はこの宿題の練習に問題があります。私は初心者ですので、Linux Cを学んでいます。Linux C - 子プロセスは、パイプが空であると考えます。

練習は簡単です:子プロセスを作成する必要があります。親プロセスは、テキストファイル(例えば、a.txt)を読み込み、パイプを介して送信する必要があります。子プロセスはパイプから読み込み、パイプの内容を端末に出力します。しかし、私は子プロセスがパイプが空であると考えてパイプを読み取っていないことを理解していません。

私は私がこれまで何をしたかのコードを投稿する:私の言語で

#include "myinclude.h" //a separate file which contains all needed headers to run the program. 

#define MERET 80 

int main(int argc,char *argv[]){ 

    int pfd[2]; 
    int status; 
    char buffer[MERET]; 
    pid_t pid; 
    FILE *fp1,*fp2; 
    if(argc != 2){ 
     printf("Nincs eleg argumentum"); 
    } 
    if(pipe(pfd) < 0){ 
     syserr("pipe"); 
    } 
    if((pid = fork()) < 0){ 
     syserr("fork"); 
    } 
    if(pid == 0){ 
     close(pfd[1]); 
     if ((fp1 = fdopen (pfd[0],"r")) <0){ 
        syserr("fdopen"); 
      } 
     printf("mukodsz"); 
     while(fgets(buffer,MERET,fp1) != NULL){//something here is not good 
      printf("%s",buffer); 
      fprintf(stdout,"Siker"); 
     } 
     close(pfd[0]); 
     exit(0); 
    } 
    close(pfd[0]); 
    if ((fp1 = fdopen (pfd[1],"w")) == NULL){ 
     syserr("fdopen"); 
    } 
    if((fp2 = fopen(argv[1],"r")) < 0){ 
     syserr("fopen"); 
    } 
    while(fgets(buffer,MERET,fp2) != NULL){ 
     fprintf(fp1,"%s",buffer); 
     //fprintf(stdout,"Siker\n"); 
    } 
    close(pfd[1]); 
    wait(&status); 
    //fprintf(stdout,"Siker"); 
    exit(0); 
} 

「sikerは」成功を意味します。私はプログラムをデバッグするために使用しましたが、子プロセスのループは何も印刷していません。

答えて

1

あなたがfdopenのとき。 fcloseにする必要があります。

close元のファイル記述子の代わりに、FILE*に関連付けられたバッファ内のまだ書き込まれていないすべてのデータが失われます。

+0

あなたは正しいです!ソリューションの問題を解決してくれてありがとう! – Zsombi

関連する問題