fifo open시 O_NONBLOCK이 언제 의미가 있나요?

미해결질문
유영재 프로필

I/O multiplexing 때 의미가 있나요? open 밑에 sleep 코드를 작성해도 open에서 찾지 못하면 바로 끝나는 것 같습니다

 

    printf("call open()\n");
    fd = open(FIFO_FILENAME, O_WRONLY | O_NONBLOCK);
    if (fd < 0) {
        perror("open()");
        return -1;
    }
    strncpy(buf, "hello", sizeof(buf));
    write(fd, buf, strlen(buf));
    close(fd);
ProgCoach4U 프로필
ProgCoach4U 4달 전

blocking/non-blocking mode는 read/write 시에 동작을 다르게 합니다. blocking mode로 open한 파일 디스크립터에 read()를 한다고 했을 때, 읽을 데이터가 있으면 바로 읽어가고, 읽을 데이터가 없는 경우 읽을 데이터가 있을 때까지 blocking 하여 기다립니다. 반면 non-blocking mode로 open한 파일 디스크립터에 read()를 한다고 했을 때, 읽을 데이터가 있으면 바로 읽어가고, 읽을 데이터가 없는 경우에는 바로 -1을 리턴합니다. 이 경우 errno가 EAGAIN으로 설정됩니다.  

named pipe의 경우 blocking mode로 open하게 되면 read-side/write-side 모두 open이 될 때까지 blocking 됩니다. 양쪽 다 열려야 비로소 열리게 되는 것이죠. 하지만 non-blocking mode로 open하게 되면 다른 한쪽이 열려있지 않더라도 open에 성공하게 됩니다. 다만 한쪽만 열려있는 경우가 발생할 수 있기 때문에 데이터 처리에 유의하셔야겠죠 :)