c - 独立的 C 模块通过控制模块下的 stdin stdout 协同工作

标签 c stream stdout stdin

假设我有三个 C 模块:

  • 第一个功能是从 /dev/urandom 生成随机输出,它可以独立工作,无需其他两个模块。
  • 第二个的功能是接受某种形式的输入并输出某种有用的信息,它也可以单独工作。
  • 最后一个的作用是管理前两个模块,并通过stdoutstdin连接、控制它们。 模块需要在第三个模块的控制下通过流进行通信。 这是可能的情况吗?我发现网上很多例子只是在C源文件之外定义一个函数,然后在main函数中调用它。这关系太弱了我只是想知道我的上述情况是否可能。如果可以的话,需要什么样的知识?

最佳答案

Is that a possible scenario?

是的。考虑一下您可以键入如下命令的事实:cat /dev/urandom | hexdump ,它的作用正是您所描述的 cat是您的“模块”之一并且 hexdump是另一个。在这种情况下,shell 本身是您的第三个模块,启动其他两个可执行文件并将它们的 io 绑定(bind)在一起。

I just wonder if my above scenario is possible. If possible, what kinds of knowledge does it need?

您可以阅读用于启动进程的 API,特别是如何配置其标准 IO 流。

例如,在 Linux 上,执行此操作的常用方法是使用 fork()创建进程,execv()加载您的“模块”,pipe()创建进程之间的连接,以及 dup2()将这些连接放入正确的(stdio)位置。

Here's一个例子。

I found that many examples on the Internet is just defining a function outside a C source file and call it in the main function. That's too weak relationship.

这并不相关,但我实际上称其为比您所说的更牢固的关系。这使用系统链接器将两段代码连接在一起。唯一更紧密的绑定(bind)是如果您不使用函数而只是一起编写代码。

关于c - 独立的 C 模块通过控制模块下的 stdin stdout 协同工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427485/

相关文章:

返回 malloc 的函数内出现 C 错误?

c - 将数组的所有元素初始化为 0

c++ - 读取文件时出现乱码问题

c - 当我输入字符而不是数字时,do-while 输出 "infinitely"

C并行垃圾收集器,如何避免锁定主线程

Java FileChannel.size() 与 File.length()

c# - 在一个 Stream 类中拼接多个流

c# - PostMessage 不适用于其输出被重定向和异步读取的控制台窗口

c++ - 总结一串数字输入的最佳方法

Docker、Tomee、日志记录、标准输出、AWS