【问题标题】:How do I run another C program within my C program?如何在我的 C 程序中运行另一个 C 程序?
【发布时间】:2020-03-25 11:27:13
【问题描述】:

(在 Linux 上运行并通过命令行运行的所有程序)所以我希望能够从我自己的 C 程序中运行已编译的 C 程序,然后能够读取该已编译 C 程序的输出并拥有我的 C 程序为该程序提供输入。 (还假设我只有另一个 C 程序的编译版本)。我知道 system() 函数,但我不确定是否可以使用它来读取已编译程序输出的内容,然后提供我自己的输入。

【问题讨论】:

  • fork pipe dupexec 是您应该研究的函数。
  • 一个简单的解决方案是将被调用程序的输出重定向到一个文件并在调用程序中处理该文件。
  • 注意,如果你只需要一个的方式,有popen。当您需要双向使用时,没有简单的解决方案 - 但要注意由于标准输入和/或标准输出上的大量数据导致的死锁。另请注意,某些程序访问 终端 而不是 stdin/stdout。 expect 程序可能对您有用。

标签: c linux command-line system


【解决方案1】:

您需要在两个程序之间设置inter-process communication 机制。有几个选项可以实现这一点:

  • 共享内存/共享文件
  • 消息队列
  • 套接字
  • 管道

您没有就您的问题提供很多背景信息,但从您的描述看来,您的两个进程并行运行并且不止一次交换数据。在这种情况下,您还必须考虑同步问题。

可以在here找到有用的介绍。

【讨论】:

  • 看来 OP 无法访问被调用程序的源代码,只能访问可执行文件。在这种情况下,其中一些解决方案无法实施。
【解决方案2】:

你可以像这样使用system()

system("executable arg1 ... > file.txt");

arg1 ... 是可执行文件的参数列表。 file.txt 是重定向到文件的可执行文件的输出。这个系统调用可以在一个分叉的进程中进行。父程序可以等待它。如果需要,可以使用同步工具在文件 file.txt 上启用并发。

【讨论】:

  • 您错过了“让我的 C 程序为该程序提供输入”部分。
  • @MaximEgorushkin 不就是在system()调用中向可执行文件传递一个参数那么简单吗?
  • 我不知道,这是你的答案。不过,不是我的 -1。
  • 这种方法仅限于将输入传递给被调用程序,然后检索其输出。但是,问题清楚地表明,必须在检索输出后给出被调用程序的输入(“然后提供我自己的输入”)。
猜你喜欢
  • 2013-07-07
  • 2011-10-17
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2022-07-09
相关资源
最近更新 更多