문제

파이프를 사용하여 보내고 받으려고합니다.

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과 같이 복구 할 수없는 오류가 발생할 때까지 읽을 때까지 읽습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top