인프런 커뮤니티 질문&답변

유영재님의 프로필 이미지

작성한 질문수

리눅스 IPC 프로그래밍 - 이론과 실습

- Live Programming(named pipe)

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

19.05.29 22:22 작성

·

1.2K

0

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);

답변 1

0

런잇(ProgCoach4U)님의 프로필 이미지
런잇(ProgCoach4U)
지식공유자

2019. 05. 30. 00:56

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에 성공하게 됩니다. 다만 한쪽만 열려있는 경우가 발생할 수 있기 때문에 데이터 처리에 유의하셔야겠죠 :)