development

명명 된 파이프 블록이 읽기 전용으로 열리는 이유는 무엇입니까?

big-blog 2020. 12. 25. 22:46
반응형

명명 된 파이프 블록이 읽기 전용으로 열리는 이유는 무엇입니까?


Python을 사용하는 다양한 UNIX (Linux, FreeBSD 및 MacOS X)에서 명명 된 파이프 (FIFO)를 처리 할 때 몇 가지 이상한 점을 발견했습니다. 첫 번째이자 아마도 가장 성가신 것은 비어 있거나 유휴 상태 인 FIFO를 읽기 전용으로 열려고하면 차단된다는 것입니다 ( os.O_NONBLOCK낮은 수준의 os.open()호출 과 함께 사용하지 않는 한 ). 그러나 읽기 / 쓰기를 위해 열면 차단되지 않습니다.

예 :

f = open('./myfifo', 'r')               # Blocks unless data is already in the pipe
f = os.open('./myfifo', os.O_RDONLY)    # ditto

# Contrast to:
f = open('./myfifo', 'w+')                           # does NOT block
f = os.open('./myfifo', os.O_RDWR)                   # ditto
f = os.open('./myfifo', os.O_RDONLY|os.O_NONBLOCK)   # ditto

이유가 궁금합니다. 후속 읽기 작업이 아닌 공개 호출이 차단되는 이유는 무엇입니까?

또한 비 블로킹 파일 설명자가 Python에서 다른 동작을 나타낼 수 있음을 알았습니다. 초기 열기 작업을 위해 사용 os.open()하는 경우 데이터가 파일 설명자에 준비되지 않은 경우 빈 문자열을 반환하는 것 같습니다. 내가 사용하는 경우, 다음은 (예외가 발생 )os.O_NONBLOCKos.read()fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)os.readerrno.EWOULDBLOCK

open()os.open()예제에서 설정하지 않은 다른 플래그가 노멀 에 의해 설정되고 있습니까? 그들은 어떻게 다르며 그 이유는 무엇입니까?


그것이 정의 된 방식입니다. open()기능에 대한 그룹 열기 페이지에서

O_NONBLOCK

    When opening a FIFO with O_RDONLY or O_WRONLY set: If O_NONBLOCK is
    set:

        An open() for reading only will return without delay. An open()
        for writing only will return an error if no process currently
        has the file open for reading.

    If O_NONBLOCK is clear:

        An open() for reading only will block the calling thread until a
        thread opens the file for writing. An open() for writing only
        will block the calling thread until a thread opens the file for
        reading.

참조 URL : https://stackoverflow.com/questions/5782279/why-does-a-read-only-open-of-a-named-pipe-block

반응형