在 Python 中使用 exec() 时如何传递套接字变量?

费拉尔图

我有一个程序版本 A,它调用 execve() 来执行另一个程序版本 B,同时保留相同的 PID。

这个程序 A 有一个套接字对象,我们希望另一个程序 B 访问同一个套接字以向已建立的连接发送一些数据。

问题是我还没有找到成功恢复序列化套接字的方法,我将它保存到一个文件中,在新程序 B 中再次打开该文件但它不是同一个对象,未初始化并且没有有任何属性集,我用过莳萝和泡菜。

在调用 exec() 时是否有一种安全的方法来传递变量对象?或者获取对象的指针引用并向前传递该指针的方法?

版本A:

#!/bin/env python
import os
import dill as pickle
import socket

print "Version A"
print os.getpid()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(("127.0.0.1",80))

with open('file1.pickle', 'wb') as handle:
    pickle.dump(s, handle)

os.execlp('python', 'python', 'verB.py')

版本 B:

#!/bin/env python
import os,pdb,sys
import dill as pickle
import socket

print "Version B"
print os.getpid()
infile = open('file1.pickle','rb')
infile.seek(0, 0)
s = pickle.load(infile)
infile.close()

s.send("mymessage")

s.close()


B版sockets未初始化,如何恢复socket?

德莱尼

在类 Unix 系统上,execve程序保留未标记的打开文件描述符FD_CLOEXEC您需要将文件描述符(一个小整数)传递给新进程。默认情况下,Python 将文件描述符设置为 close-on-exec,因此如果您的父进程是 Python 进程,则需要专门更改该标志。您可以将套接字 fd 写入文件:

open("file1.txt", "w").write(str(s.fileno()))

但更常见的是,人们要么在命令行上传递它,要么将它塞进环境中。作为python使用命令行传递的套接字调用python的示例:

verA.py

import socket
import os
import sys

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("stackoverflow.com", 80))
os.set_inheritable(sock.fileno(), True)
os.execlp(sys.executable, "python", "verB.py", str(sock.fileno()))

动词.py

import socket
import sys

sock = socket.fromfd(int(sys.argv[1]), socket.AF_INET, socket.SOCK_STREAM)
sock.send(b"GET / HTTP/1.1\r\nHost:stackoverflow.com\r\n\r\n")
print(sock.recv(500))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章