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