【问题标题】:Setting a fmemopen ed file descriptor to be the standard input for a child process将 fmemopen ed 文件描述符设置为子进程的标准输入
【发布时间】:2011-09-06 08:10:15
【问题描述】:

我在 Linux 中有一个 fmemopen 文件描述符(指向父级中的缓冲区),我希望能够在 C 中将此文件描述符设置为子进程的标准输入(我没有可以访问代码)

这可能吗?如果是这样,我该怎么做?如果可能的话,我想避免写入磁盘。

【问题讨论】:

  • 澄清一下:您想使用 mmap 写入实际上未连接到真实文件的 fd?
  • 对不起,当我写问题时我使用了错误的函数,我真正想要的是一个 fmemopen 文件(即可以像文件一样使用的内存块)。我想如果有必要我可以把它全部推到标准输出,但我想避免这种情况。

标签: c linux pipe mmap


【解决方案1】:

这是不可能的。继承 stdin/out/err 纯粹基于文件描述符,而不是 stdio FILE 流。由于fmemopen没有创建文件描述符,所以它不能成为新进程的stdin/out/err,也不能以任何方式用于进程间通信。您正在寻找的是一个管道,除非您需要寻找,在这种情况下您需要一个临时文件。 tmpfile 函数可以用来创建一个,而不必担心在文件系统中创建一个可见的名称。

【讨论】:

    【解决方案2】:

    我不确定你是否可以直接使用你的 fd(如果,那么你会使用 dup2()),但如果不能,你可以创建一个 pipe() 来提供你的内存数据和客户端可以收到。同样,在fork()ing 之后,您可能还需要dup2()。

    【讨论】:

      【解决方案3】:

      只需在分叉之前将文件描述符 0 替换为您的 mmaped 文件描述符:

      int fd = ...;
      dup2(fd, 0);
      fork();
      

      【讨论】:

      • uhm.. 最好在 分叉后这样做
      猜你喜欢
      • 2019-02-26
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2020-05-05
      相关资源
      最近更新 更多