当前位置: 首页 > 面试题库 >

如何安全地将net.Listener()的FD传递给子进程?

慕和惬
2023-03-14
问题内容

我已经被这个问题困扰了几个小时了:

我有一个主进程充当TCP服务器,主进程调用Fork(),将其net.Listener()的FD传递给子进程。然后,子进程可以使用net.Filelistener()继承此FD。

我已经通过许多开源代码研究了这个问题,还做了一些实验。但是不幸的是,这些解决方案目前尚不满足我的需要,因为它们不便于携带,您还需要许多危险的低级工作。

如果有任何将net.Listener()的FD传递给子进程SAFELY的解决方案,我很高兴知道。

我现在尝试过的是:

  1. 环境值(非可移植性)会导致许多FD混乱,这是不安全的,因为可以从外部进行更改。

  2. Dup FD&Clear FD_CLOEXEC然后是exec / fork,可移植,但不受Go API支持,syscall.NoCloseOnExec()提交给开发团队的更改被拒绝,因为他们希望保持syscall清洁。

  3. 设置为SO_REUSEADDR使子进程可以立即监听端口,然后关闭父监听器。失败,不可移植,Go API不支持,也不安全。

  4. exec.Command.ExtraFiles(),不知道如何从子进程中继承FD,我是否需要一个配置文件来保存FD和名称?此解决方案也有一个错误,有关更多详细信息,请阅读exec的文档。

好的,我已经写了这个问题的简单测试案例(使用解决方案4):

https://github.com/reckhou/go-fd-pass-test

还包括OS X和Linux上的2个可执行文件。我尝试了Go 1.1和Go 1.1.1,但此问题仍然存在。


问题答案:

最简单的方法是在exec.Cmd的ExtraFiles字段中传递侦听器。

父母的例子:

var l *net.TCPListener
cmd := exec.Command(...)
f, err := l.File()
cmd.ExtraFiles = []*os.File{f}

孩子的例子:

l, err := net.FileListener(os.NewFile(3, "listener"))

您可能还需要对此进行概括,并让孩子接受PROGRAMNAME_LISTENER_FD作为环境变量。然后,父级将在启动子级之前将环境变量设置为3。



 类似资料:
  • 问题内容: 我正在使用包装节点的库。但是我不知道如何将STDIN传递给子进程execFile … 在CLI上,它看起来像这样: 更新1 尝试使其与: 问题答案: 这是我如何使其工作的方法:

  • 问题内容: 可以说我有一个SP,其语句如下: 但是数据必须通过包含值字符串的单个变量到达该子句。以下内容链接 但是它不能那样工作。任何想法如何做到这一点? 问题答案: 像这样传递参数值- 。然后,使用FIND_IN_SET函数就足够了-

  • 问题内容: 我想在C 中使用 fork() 创建流程的副本。我不知道如何将参数传递给流程的副本。例如,我想将整数传递给流程副本。 或者我该怎么办,如果我有一个循环,我在其中调用fork()并想将唯一的值传递给进程(例如0 … N) 问题答案: 有趣的是,您产生的每个进程都会自动获取父进程拥有的所有内容的副本,因此,例如,我们想将int传递给两个子进程中的每个,但我希望每个进程都具有与父进程不同的值

  • 问题内容: 我想将回调传递给加倍嵌套的组件,并且尽管我能够有效地传递属性,但我不知道如何将回调绑定到正确的组件上才能被触发。我的结构如下所示: 单击列表项时应触发一个回调,这是OutermostComponents方法“ onUserInput”,但相反,我得到“未捕获的错误:未定义不是函数”。我怀疑问题出在我如何在第一个内部渲染SecondNestedComponent并将其传递给回调函数。代码

  • 我正在使用GraphQL查询一个对象,该对象将由大约15个不同的REST调用组成。这是我的根查询,我在其中传入查询的ID。这对于正确解析的主要student对象非常有效。但是,我需要弄清楚如何将ID传递给地址解析程序。我尝试将args添加到address对象,但出现了一个错误,表明args没有从Student对象传递下来。所以我的问题是:如何将客户机查询中的参数传递给GraphQL服务器中的子对象

  • 人们通常如何在React应用程序中拥有“全局”数据? 例如,假设一个用户登录到我的应用程序后,我有以下数据。 但这对我来说似乎很困难,因为这意味着我必须通过每个组合传递数据,只是为了将其传递给需要它的孩子。 是否有一种React方法来管理这种类型的数据? 注意:这个示例非常简化--我喜欢将意图包装成复合,这样整个UI特性的实现细节就可以在我认为合适的时候进行彻底的更改。 编辑:我知道默认情况下,在