Skip to main content
 首页 » 编程设计

python之文件描述符的继承之Python 3.4

2025年05月04日11zdz8207

https://docs.python.org/3.5/library/os.html#fd-inheritance 下的文档关于“文件描述符的继承”说:

“在 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()”我得到 False,这意味着套接字不可继承。 但是子进程好像继承了socket描述符。

我错过了什么吗? 为什么会这样?

谢谢

更新:

这是在子进程中等待接受的“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”向套接字发送“Hello”:

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”后,我在“server.py”的终端中看到“Hello”消息。

请您参考如下方法:

不可继承意味着描述符是关闭的,正如它在您的引述中所说的那样。这并不意味着 Python 中对套接字对象的引用消失了。

更有意义的测试是尝试从条件语句的两个分支中的套接字读取数据。