Я пытаюсь понять, как select()
работает как функция в Unix.У меня есть рабочий образец с сокетом, но у меня проблема с ним при использовании файлов.При использовании select()
на файловом объекте он не ждет - вместо этого он продолжает непосредственно код, потом напрямую.
Этот пример работает хорошо:
import socket
from select import select
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(("127.0.0.1", 1111))
server_socket.listen(5)
# this function wait when server_socket descriptor will change
read, write, error = select([server_socket], [], [])
# this part print when I use "nc 127.0.0.1 1111"
print(server_socket)
Но когда я пытаюсьиспользовать тот же код с файлами, у меня неожиданный результат.
import os
import fcntl
from select import select
file_descriptor = os.open('/tmp/test_file', os.O_CREAT)
# lock file? I try to use lockf, other options
fcntl.flock(file_descriptor, os.F_LOCK | os.O_SHLOCK)
# I think that select must wait when the file will be unlocked
read, write, error = select([], [file_descriptor], [])
# prints immediately
print(file_descriptor)