1

假设我创建了一个socketpair()并将其中一个套接字的句柄传递给一个衍生进程(popen),该进程能否与父进程通信?

我看到的示例是使用fork()的,这超出了我当前项目的范围。

更新:我尝试了一个简单的测试:

  1. 客户端:socketpair带套接字[0]

  2. 从客户端使用posix_spawn套接字1作为命令行参数

  3. 客户端:write到套接字...客户端退出没有任何警告...

这种方法似乎有问题。

更新: 我还发现了这个注释

Pipes and socketpairs are limited to communication between processes with a common ancestor.

4

2 回答 2

2

execve 的手册页指出:

 File descriptors open in the calling process image remain open in the new
 process image, except for those for which the close-on-exec flag is set
 (see close(2) and fcntl(2)).  Descriptors that remain open are unaffected
 by execve().

因为像 popen 这样的函数是基于 execve 的,所以你从 socketpair 函数得到的文件描述符应该在两个进程中都很好,我不明白为什么你不能以任何你喜欢的方式传递描述符。我假设在这种情况下,您的意思是将其转换为字符串并通过 STDIN 将其设置为子进程,这会将其转换回 int 以用作文件描述符。

编写一些试用代码当然值得。

于 2009-11-05T20:24:39.710 回答
0

是的,您可以将其传递给子进程。诀窍实际上是 socketpair() 为您提供了一对连接的套接字 - 确保孩子保留一个,父母保留另一个(父母应该关闭孩子,反之亦然)。

大多数情况下使用一对管道代替。

于 2009-11-06T13:25:06.923 回答