명명 된 파이프 블록이 읽기 전용으로 열리는 이유는 무엇입니까?
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_NONBLOCK
os.read()
fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)
os.read
errno.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
'development' 카테고리의 다른 글
사용자 정의 클래스가있는 유형 힌트 (0) | 2020.12.25 |
---|---|
Python 3 및 정적 타이핑 (0) | 2020.12.25 |
Java에서 JSON 문자열 구문 분석 (0) | 2020.12.25 |
Android가 NTP를 사용하여 시간을 동기화합니까? (0) | 2020.12.25 |
데이터베이스 유형별 실제 사례 (실제 사례) (0) | 2020.12.25 |