문제
파이프를 사용하여 보내고 받으려고합니다.
send.cpp
struct
{
long a;
long b;
}T;
cout << "1" << endl;
if ( access ( FIFO_NAME, F_OK ) == -1 ) {
res = mkfifo ( FIFO_NAME, 0755 );
if ( res != 0 )
cout << " Can't make fifo" << endl;
}
cout << "2" << endl;
pipe_fd = open ( FIFO_NAME, O_WRONLY);
cout << "3: " << pipe_fd << endl;
a=b=1;
res = write ( pipe_fd, &T, sizeof ( T ) );
cout << "4" << endl;
close(pipe_fd);
recv.cpp
cout << "1" << endl;
pipe_fd = open(FIFO_NAME, O_RDONLY | O_NONBLOCK);
cout << "2" << endl;
res = read(pipe_fd, &T, sizeof(T));
cout << T.a << T.b << endl;
close(pipe_fd);
./send ./recv
Open은 정확하지만 Send.cpp가 "쓰기"를 실행하면 프로그램이 종료되고 "4"가 표시되지 않습니다 !!!! 나는 ta와 tb가 맞지 않는다.
내 프로그램에 무슨 문제가 있습니까?! (O_NONBLOCK FALG를 제거 할 때 프로그램이 올바르게 작동한다고 말해야합니다)
감사해요
해결책
특히 비 블로킹 I/O를 사용할 때 read () 및 write ()의 반환 값을 확인해야합니다. 읽고 싶은 데이터가 아직 없기 때문에 실패 할 수 있으며, 모두 작성되지 않았기 때문에 일부 데이터를 반환 할 수는 없으며 오류 코드 Eintr 또는 Eagain으로 실패 할 수 있습니다. 일반적으로 원하는 데이터가 있거나 Eintr/eagain과 같이 복구 할 수없는 오류가 발생할 때까지 읽을 때까지 읽습니다.
제휴하지 않습니다 StackOverflow