2017-12-27 22 views
1

問題が発生しました。一度フォークする単純なプログラムを書こうとすると/dev/urandomを持つFIFO

親プロセスは/ dev/urandomから子バイトを送信し、子はそれらをスクリーンに出力します(1行につき15バイトで15バイト)。問題は次のとおりです。

B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0:私が最初にコンパイルプログラムの開発を開いたときの出力は次のようになりますB0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 ... B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0 B0

(常にではない "B0"、しかし確実に同じO​​NEバイト) 私は、同じプログラム(再コンパイルされていない)を実行すると、もう一度出力がOKと思われる...任意のアイデア?

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <termios.h> 





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

     char bufforek[256]; 

     printf("P1: READING /dev/urandom\n"); 

     FILE *file_ptr = fopen("/dev/urandom", "r"); 


     int file=open("FIFO",O_RDWR); 
     mkfifo("FIFO",0666); 
     char pomoc; 
     int hexa; 
     int i=1; 


     if(fork()==0) 
     { 

      char bufforek1[256]; 
      while(read(file,bufforek1,sizeof(bufforek1))) 
      { 

       pomoc = *bufforek1; 
       // printf("%hhX ", pom); 

       hexa = (int)pomoc; 
       pomoc = *bufforek1; 
       printf("%hhX ", pomoc); 
       if(i==15) 
       { 
        printf("\n"); 
        i=1; 
       } 
       else i++; 
       // write(pipe_table[1],bufforek,sizeof(bufforek)); 

      } 
      return 0; 
     } 
     while ((fgets(bufforek, sizeof(bufforek), file_ptr))!=NULL) write(file, bufforek, sizeof(bufforek)); 

     unlink("FIFO"); 


    return 0; 
} 
+1

いくつかの問題...なぜあなたはそれを開いた後、FIFO mkfifo()を作成していますか?そしてあなたはそれぞれのfdsから読み取られたバイト数をチェックしていません... – rodrigo

答えて

0

ロドリゴが指摘するように、あなたの指示mkfifoopen("FIFO"...)はあなたが一時的なFIFOを使用しようとしているならば、あなたは、単にむしろFIFOを作成および削除よりもpipe(2)コールを使用することができ、また、逆方向にあります。