J’ai remarqué quelques bizarreries avec les FIFO nommés sous différentes versions d’UNIX (Linux, FreeBSD et MacOS X) utilisant Python. Le premier, et peut-être le plus ennuyeux, est que les tentatives d’ouverture d’une FIFO vide / inactive en lecture seule vont bloquer (sauf si j’utilise os.O_NONBLOCK
avec l’appel os.open()
niveau inférieur). Cependant, si je l’ouvre pour lire / écrire, je n’ai aucun blocage.
Exemples:
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
Je suis juste curieux de savoir pourquoi. Pourquoi l’appel ouvert bloque-t-il plutôt qu’une opération de lecture ultérieure?
J’ai également remarqué qu’un descripteur de fichier non bloquant peut présenter différents comportements en Python. Dans le cas où j’utilise os.open()
avec os.O_NONBLOCK
pour l’opération d’ouverture initiale, un os.read()
semble renvoyer une chaîne vide si les données ne sont pas prêtes sur le descripteur de fichier. Cependant, si j’utilise fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)
un os.read
déclenche une exception ( errno.EWOULDBLOCK
)
Y a-t-il un autre drapeau défini par le open()
normal qui n’est pas défini dans mon exemple os.open()
? Comment sont-ils différents et pourquoi?
C’est comme ça que c’est défini. De la page Open Group pour la fonction 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.