2014-11-28 1 views
0

O_RDWR 모드에서 open()을 사용하여 양쪽에서 열린 FIFO 파이프가 있습니다. 읽기 끝에는 read()가 모든 문자를 읽지는 않지만 호출에 지정된 문자보다 작습니다. open()을 사용하여 모든 문자를 읽도록하는 방법이 있습니까? 사전에open() 시스템 콜을 사용하여 FIFO로 작성된 모든 문자 읽기

감사

if (p != NULL){ 

     printf("Inside p not null!\n"); 

     if((fd = open(p, O_RDWR)) < 0){ 
      perror("File could not be opened!"); 
      exit(EXIT_FAILURE); 
     } 

     //FILE *rdptr = fopen(p,"r"); 

     memset(buf,0,file_len); 
     rc = read(fd, buf, file_len); 
     printf("Number of bytes read: %d\n", rc); 

     printf("Data detected on FIFO\n"); 
       buf[rc] = '\0'; 
       char base[20] = "output.txt"; 
       char name[20]; 
       sprintf(name, "%d%s", suffix, base); 
     FILE *fptr = fopen(name,"ab+"); 
     fd_wr = open(name,O_WRONLY); 
     charnum = write(fd_wr,buf,rc); 
     kill(id_A, SIGKILL); 
     //printf("No. of characters written: %d\n",charnum); 
       //FD_CLR(fd, &rdfs); 
    } 
+0

나머지 문자를 읽으려면'read()'를 다시 호출 해 보았습니까? – saeedn

+0

아니요, 한 번 읽는 중입니다. 코드가 편집 된 게시물에 추가됩니다. 어떻게해야할지 모르겠다. – user3033194

+0

고정 된 양의 데이터를 작성한 다음 작성자를 죽이는 경우 대신 파일을 사용하십시오. 여기에 FIFO가 필요없는 것 같습니다. – nneonneo

답변

0

먼저 약간의 코멘트 : 당신이 파일을 열 O_RDONLY를 사용한다 : 필요 이상의 권한을 사용하지 않습니다.

두 번째 문제 : file_len이 매우 큰 경우 (FIFO에 일정량의 읽지 않은 데이터 만 저장할 수 있기 때문에) 작성자가 전체 데이터 덩어리 쓰기를 차단했을 수 있습니다. 그렇다면 read은 FIFO에 저장된 데이터 만 읽으며 읽을 수있는 모든 데이터를 즉시 반환합니다. 그러면 writer가 더 많은 바이트를 쓸 수있게되고, 그 다음 bytes는 다음에 읽혀질 것입니다. read.

전체 file_len 바이트를 읽을 때까지 버퍼로 오프셋을 조정하여 루프 읽기를 수행해야합니다. 다음과 같은 것 :

size_t offset = 0; 
while(offset < file_len) { 
    rc = read(fd, buf+offset, file_len-offset); 
    if(rc < 0) { 
     /* handle I/O error or something... */ 
    } else { 
     offset += rc; 
    } 
} 
+0

while (rc user3033194

+0

죄송합니다. 제대로 포맷 할 수 없지만 그게 무슨 뜻입니까? – user3033194

+0

아니요.'read'는 부분 출력을 생성 할 것이고 더 많이 읽으려면 오프셋을 증가시켜야합니다. (책을 읽는 것과 같습니다. 처음부터 다시 시작하지 않고 중단 한 부분부터 시작합니다.) – nneonneo

관련 문제