2015-05-16 42 views
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」的終端中。

回答

0

非可繼承意味着描述符已關閉,正如它在引用中所述。這並不意味着Python中對套接字對象的引用會消失。

更有意義的測試是嘗試從條件的兩個分支中的套接字讀取。

+0

關閉fd的要點是什麼?套接字對象在子進程中仍然可用嗎? – user2624744

+0

這就是要點 - 套接字對象在子進程中不可用,只能是父進程。 – jwilner

+0

剛剛測試過它,我可以在子進程中完美接收套接字上的數據。 – user2624744