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;
}
감사합니다. Bert! 그것처럼 보입니다. 따라서 EAGAIN은 단지 스트림 레벨까지 전파되고 에러 셋이 생깁니다. 그래서 내 접근 방식은 효과가 없을 것입니다. 그냥 표준 방식으로 렉스에 대처하려고하면 :) 더 봐 ... –
그래, 그것에 대해, 파이프가 일시적으로 차단되면 EOF를 반환 생각하면 수신기가 모든 데이터를 말할 수 없을 것입니다 아직 들어왔다. 데이터의 나머지 부분을 얻기 위해 다시 연결해야하는 프로토콜이 없다면 파이프가있는 실제 작업을 수행하는 프로그램을 작성할 수 없습니다. –