我已经被这个问题困扰了几个小时:
我有一个作为TCP服务器的主进程,主进程调用Fork(),将其net.Listener()的FD传递给子进程。然后子进程可以使用net.Filelistener()继承这个FD。
我通过许多开源代码进行了研究,也进行了一些实验。但不幸的是,目前没有一个解决方案能够满足我的需求,因为它们不可移植,还需要许多危险的低级工作。
如果有任何安全地将net.Listener()的FD传递给子进程的解决方案,我会很高兴知道。
我现在尝试过的方法:
环境变量值不可移植,会对许多FDs造成混乱,不安全,因为可以从外部更改。
Dup FD&清除
FD_CLOEXEC
然后执行/ fork,可移植但不受Go API支持,已提交syscall.NoCloseOnExec()
更改给开发团队,但被拒绝,因为他们想保持syscall的干净。设置
SO_REUSEADDR
,以便子进程可以立即侦听端口,在此之前关闭父进程的侦听器。失败,不可移植,不受Go API支持,也不安全。exec.Command.ExtraFiles()
,不知道如何从子进程获取继承的FDs,我需要一个配置文件来保存FD和名称吗?这个解决方案也有一个错误,请阅读exec文档以了解更多详细信息。
好的,各位,我已经编写了一个简单的测试用例来解决这个问题(使用解决方案4):
https://github.com/reckhou/go-fd-pass-test
同时在OS X和Linux上包含2个可执行文件。我尝试过Go 1.1和Go 1.1.1,但这个问题仍然存在。