2017-12-27 38 views
1

문제가 있습니다. 한 번 포크하는 간단한 프로그램을 작성하려고합니다/dev/urandom이있는 FIFO

부모 프로세스는/dev/urandom에서 하위 바이트를 보내고 자식은 화면에 출력합니다 (한 줄에 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 : 처음 컴파일을 programm 열면 출력 같다 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", 그러나 확실하게 같은 ONE 바이트) 나는 같은 프로그램을 실행하면 (안 재 컴파일) 다시 한번 출력은 괜찮은 것 같습니다 ... 어떤 아이디어? 로드리고가 지적 하듯이

#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

몇 가지 문제가 있는데 ... 왜 당신이 그것을 열면'mkfifo()'를 만들고 있습니까? 그리고 각 fds에서 읽은 바이트 수를 확인하지 않습니다 ... – rodrigo

답변

0

, 당신의 지시 mkfifoopen("FIFO"...)는 임시 FIFO를 사용하려는 또한, 당신은 단순히 오히려 작성 및 FIFO를 삭제하는 것보다 pipe(2) 전화를 사용할 수 있습니다, 뒤쪽을 향하게됩니다.