Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件描述符的继承-Python 3.4_Python_Sockets_File Descriptor - Fatal编程技术网

文件描述符的继承-Python 3.4

文件描述符的继承-Python 3.4,python,sockets,file-descriptor,Python,Sockets,File Descriptor,关于“文件描述符的继承”下的文档说明: 在UNIX上,不可继承的文件描述符在执行新程序时在子进程中关闭,其他文件描述符则被继承 另外,套接字的文档中说,“新创建的套接字是不可继承的。” 我刚刚用以下代码对其进行了测试: import socket, os sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.

关于“文件描述符的继承”下的文档说明:

在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,这意味着套接字是不可继承的。 但是子进程似乎继承了套接字描述符

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

谢谢

更新:

下面是在子进程中等待接受的“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中对套接字对象的引用消失


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

Non-inheritable意味着描述符是关闭的,正如您在引号中所说的那样。这并不意味着Python中对套接字对象的引用消失


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

关闭fd有什么意义?socket对象在子进程中仍然可用吗?这就是问题所在--socket对象在子进程中不可用,只能在父进程中使用。刚刚测试过,我完全可以在子进程中接收套接字上的数据。@user2624744,如果您愿意,您可以在问题中发布更新的代码,显示新的测试。关闭fd有什么意义?socket对象在子进程中仍然可用吗?这就是问题所在--socket对象在子进程中不可用,只能在父进程中使用。刚刚测试过,我完全可以在子进程中接收套接字上的数据。@user2624744,如果您愿意,您可以在问题中发布显示新测试的更新代码。我不完全确定这一点,但我认为继承仅适用于“执行新程序时”,这意味着使用
os.fork
创建的子进程将继承文件描述符,但使用
os.system
子进程创建的子进程将继承文件描述符,etc不会继承文件描述符。我对此不完全确定,但我认为继承只适用于“在执行新程序时”,这意味着使用
os.fork
创建的子进程将继承文件描述符,但使用
os.system
子进程
创建的子进程将继承文件描述符,不会继承文件描述符。