2010-12-07 5 views
2

파이프의 읽기 끝에서 fread()를 읽어야합니다.fread() 파이프를 기반으로하는 디스크립터에서 읽는 것은 EOF가 아닌 데이터를 설정합니다.

하지만 파이프에 아무 것도 없을 때 fread()가 EOF를 설정하려고하지만 대신 오류 표시기가 설정됩니다. 나는 posix와 C 표준을 점검하고 단서를 발견하지 못했다.

가 아닌 차단 파이프를 사용하고 있기 때문에
#include <stdio.h> 
#include <fcntl.h> 

int main() 
{ 
    char buf[128]; 
    FILE *f; 
    int pipe_fd[2], n; 

    pipe(pipe_fd); 
    fcntl(pipe_fd[0], F_SETFL, O_NONBLOCK); 

    f=fdopen(pipe_fd[0], "r"); 
    n=fread(buf, 1, 1, f); 
    printf("read: %d, Error: %d, EOF: %d\n", n, ferror(f), feof(f)); 

    return 0; 
} 

답변

8

, 당신이 얻을 것이라고 생각 :

을 아마 내가 발췌을 마우스 오른쪽 단추로 (바보, 읽기) 의도하지 않은 뭔가 : 여기

을 것하고 있어요

  • errno==EAGAIN 읽을 거리가 없을 때 (지금은 아무 것도 없지만 나중에는 다시 시도하십시오. 나중에 다시 시도하십시오).
  • EOF 파이프의 쓰기면이 닫힐 때 (더 이상의 데이터가 없다는 것을 의미).

read()에 대한 맨 페이지에서 O_NONBLOCK 모드가 설정된 경우의 read() 동작 방법을 참조하십시오. fread() 동작이 read()와 일치해야합니다.

+1

감사합니다. Bert! 그것처럼 보입니다. 따라서 EAGAIN은 단지 스트림 레벨까지 전파되고 에러 셋이 생깁니다. 그래서 내 접근 방식은 효과가 없을 것입니다. 그냥 표준 방식으로 렉스에 대처하려고하면 :) 더 봐 ... –

+0

그래, 그것에 대해, 파이프가 일시적으로 차단되면 EOF를 반환 생각하면 수신기가 모든 데이터를 말할 수 없을 것입니다 아직 들어왔다. 데이터의 나머지 부분을 얻기 위해 다시 연결해야하는 프로토콜이 없다면 파이프가있는 실제 작업을 수행하는 프로그램을 작성할 수 없습니다. –

관련 문제