python中轮询套接字的问题
在我开始轮询循环后,在第一次迭代后打印的所有消息都需要我在终端中按enter键才能显示python中轮询套接字的问题,python,sockets,fork,polling,Python,Sockets,Fork,Polling,在我开始轮询循环后,在第一次迭代后打印的所有消息都需要我在终端中按enter键才能显示 #!/usr/bin/python import socket, select, os, pty, sys s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', 5007)) s.listen(5) mypoll = select.poll() mypoll.register(s.fileno() ) while True:
#!/usr/bin/python
import socket, select, os, pty, sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 5007))
s.listen(5)
mypoll = select.poll()
mypoll.register(s.fileno() )
while True:
print "poll time"
subr = mypoll.poll()
for x in subr[0]:
if x == s.fileno():
conn, addr = s.accept()
pid, fd = pty.fork()
if pid != 0:
mypoll.register(fd)
print "done. go back to poll now"
else:
print "forked"
#handles new connection
else:
data = os.read(x,1024)
print data
在第一次迭代之后,您还没有注册pty fd,然后正在轮询它吗?并且它的fd永远不会等于套接字fd,因此您将读取pty fd。现在不是在你的终端上读吗?那么,键入返回值不会导致它“打印数据”吗?在第一次迭代之后,您没有注册pty fd,然后轮询它吗?并且它的fd永远不会等于套接字fd,因此您将读取pty fd。现在不是在你的终端上读吗?那么,输入返回值不会导致它“打印数据”吗?这个程序可能是我几个月来看到的最难遵循的流程。您应该在这里修复基本错误。您正在分叉一个将恢复与父级同时接受连接的子级-听起来很糟糕。您正在使用轮询循环重新注册子对象的控制终端,而不是接受的连接?我忘了将无限循环放在它应该处理新fork的位置。我希望我可以编辑它,这样我就可以用:while True:pass替换“#handles new connection”。这个程序可能是我几个月以来看到的最难遵循的流程。您应该在这里修复基本错误。您正在分叉一个将恢复与父级同时接受连接的子级-听起来很糟糕。您正在使用轮询循环重新注册子对象的控制终端,而不是接受的连接?我忘了将无限循环放在它应该处理新fork的位置。我希望我可以编辑它,这样我就可以将“#handles new connection”替换为:while True:passAll fd应该转到最终的else语句,但只有在它们有数据供我读入之后。所有fd都应该转到最终的else语句,但只有在它们有数据供我读入之后。