2015-05-16 29 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