2017-02-21 5 views
0

私はファイルを読み込み、子プロセスとキーワードに一致する行を返して親に伝えようとしていますが、順序は関係ありません。パイプでファイルのすべての行を取得できません

私の最初の質問は次のとおりです。パイプを1つしか使用できないか、最初のプロセスでパイプを閉じることができますか?

私の2番目の質問は、それぞれの子のためのパイプを作成し、まだ親がそれらのすべてを読んでいない、最初のファイルのキーワードに一致するすべての行と2番目のファイルの最初の行の一致と停止を表示することです。 (私は2つのファイルしか試していませんが、それは問題ではありません)

すべてのファイルのオープンとクローズが正常に動作するものとします。私はすべてのファイルオープン、パイプ()とフォーク()のチェックを持っています。残りはチェックされません。

私のコードは以下の通りです:

#include "commons.h" 
//efmalloc is error-free malloc 

int main(int argc, char *argv[]){ 
    int numargs = argc-1; 
    int fds[numargs][2]; 
    pid_t n; 

    for (int i = 0; i < numargs; i++) 
     pipe(fds[i]); 
    for(int i = 0; i < argc-1;i++){ 
     n = fork(); 
     if(n==0){ 
      close(fds[i][0]);//closing the read end of the pipe for the children 
      FILE * fs = fopen(argv[i+1],"r"); 
      //// SETTING UP THE PARAMETERS FOR READING //// 
      char * outputdata = (char*) efmalloc(400*sizeof(char)); 
      *outputdata = '\0'; 
      char * line = NULL; 
      size_t len = 0; 
      int read = getline(&line, &len, fs); 
      int currentline = 1; 
      //// END OF READINGS SETUP //// 

      while (read >= 0) { 
       if(strstr(line,"keyword") != NULL) { 
        strcat(outputdata,argv[i+1]); 
        strcat(outputdata,line); 
        strcat(outputdata,"\0"); 
        //Write the data in the pipe in here 
        write(fds[i][1],outputdata,(strlen(outputdata)+1)); 
        *outputdata = '\0'; 
       } 
       read = getline(&line, &len, fs); 
       currentline++; 
       } 
      free(outputdata); 
      fclose(fs); 
      close(fds[i][1]); //now closing the write end of the pipe 
      exit(0); 
     } 
    } 
    /***** PARENT PROCESS *****/ 
    if(n!=0) { 
     for (int index = 0; index < numargs; index++) 
      close(fds[index][1]); 
     char * readmsg = (char*)efmalloc(BUFFER_SIZE*sizeof(char)); 
     for(int j = 0; j < numargs; j++){ 
      int bytes = read(fds[j][0],readmsg,BUFFER_SIZE); 
      while(bytes>0){ 
       readmsg[bytes] = 0; 
       printf("%s\n", readmsg); 
       bytes = read(fds[j][0],readmsg,BUFFER_SIZE); 
      } 
     } 
     for(int i = 0; i < numargs;i++) 
       wait(NULL); 
    } 
    return 0; 
} 
+1

コードを機能に分割します。これにより、デバッグが容易になります。 – sturcotte06

答えて

0

私はいくつかのマイナーな問題を参照し、2つの巨大なもの:

  • getline()read()両方リターンssize_t、ないint。それらはではなく、と同じです。
  • strcat(outputdata,"\0");何もしません。 outputdataがすでに正しく終了している場合は不要です。outputdataがまだ正しく終了していない場合は、未定義の動作です。
  • readmsgには、'\0'ターミネータのための十分なスペースがありません。BUFFER_SIZEバイトまで読み取ることができますが、割り当てられたバッファの外側には、readmsg[BUFFER_SIZE] = 0;があります。これは未定義の動作です。
  • すべてのデータが実際にoutputdataに収まることは確かではありません。どのくらいのものが実際に収まるかにかかわらず、あなたはどんどん詰まっています。 outputdataをオーバーランさせると、未定義の動作に戻ります。
+0

ファイルの行が最大256文字で、ファイルの名前が最大64文字であることがわかりました。私は400行以上を割り当てています。そして、おかげさまで私はそれらを修正します。 – user7601055

関連する問題