1
約「的文件描述符繼承」 https://docs.python.org/3.5/library/os.html#fd-inheritance下的文件說:傳承 - 的Python 3.4
「在UNIX上,非遺傳的文件描述符的子進程在一個新的程序的執行關閉,其他文件描述符被繼承。「
此外,套接字的文檔說,「新創建的套接字是非可繼承的。」
我剛纔用下面的代碼進行了測試:
import socket, os
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('localhost', 9999))
sock.listen(512)
sock.settimeout(1)
print("Socket inheritable?: {}".format(sock.get_inheritable()))
pid = os.fork()
if not pid: # child process
print(sock)
else:
pass
通過調用「sock.get_inheritable()」我得到的假,這意味着插座是不可繼承。 但子進程似乎已經繼承了套接字描述符。
我錯過了什麼嗎? 這是爲什麼呢?
感謝
更新:
這裏是 「server.py」 等待的子進程接受:
import socket, os, time
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('localhost', 9999))
sock.listen(512)
sock.setblocking(True)
print("Socket inheritable?: {}".format(sock.get_inheritable()))
pid = os.fork()
if not pid: # child process
sock, addr = sock.accept()
data = sock.recv(100)
print(data.decode())
else:
while True:
time.sleep(1)
「client.py」 發送 「你好」 向socket:
import socket, time, select, sys
msg = "Hello".encode()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',9999))
s.setblocking(1)
s.send(msg)
s.close()
啓動server.py並運行「client.py」後,我看到「Hello」消息e打印在「server.py」的終端中。
關閉fd的要點是什麼?套接字對象在子進程中仍然可用嗎? – user2624744
這就是要點 - 套接字對象在子進程中不可用,只能是父進程。 – jwilner
剛剛測試過它,我可以在子進程中完美接收套接字上的數據。 – user2624744