【问题标题】:Executing shell commands from a C program从 C 程序执行 shell 命令
【发布时间】:2014-03-06 10:21:32
【问题描述】:

是否可以使用 C 程序写入正在运行的 shell (Bash) 的标准输入?实际上,我想在我的 C 程序中使用 bash 执行命令,而不使用 exec*() 系统调用之一。

【问题讨论】:

  • 最终,您将需要一个fork() 和一个exec*() 调用来运行bash 程序;没有任何真正的选择(除非你算上posix_spawn(),而我没有)。然后是组织bash 上的管道的问题,以处理标准输入(来自您的程序?)和标准输出(到您的程序?)和标准错误,以及正确的shell 选项(-i?)。你预计在你的强制 shell 中执行什么样的命令?
  • 我只想从我的程序中获取一个字符串输入并将这个字符串发送到任何正在运行的 bash 实例,然后 bash 会为我执行并将相应的输出发送到我的程序。
  • 请注意,您不能随意将命令发送到任何正在运行的 Bash 实例;他们中的大多数都忙于做别人的工作,并且在错误的当前目录中并且设置了错误的环境等等。您将需要运行自己的 shell;如果你小心的话,你不必为每个单独的命令运行一个新的 shell,但你需要 fork()exec*()bash 通信。您将需要两个或三个管道(shell 的标准输入、shell 的标准输出、shell 可能单独的标准错误),并且您需要考虑如何阅读它们。

标签: bash unix c


【解决方案1】:

/bin/echo 通常是一个 C 程序。

/bin/echo ls | sh

瞧!一个 C 程序刚刚写入一个正在运行的 shell 的标准输入,然后执行了一个命令。这显然是可能的。

man popen 现在是你的朋友。 (更多内容确实超出了 SuperUser 的范围,讨论其他内容,例如 system() 和引用的需要。)

【讨论】:

  • 还有一个程序/bin/echo;但是,大多数 shell 都有一个内置命令 echo
  • 使用内置会不必要地混淆答案。而可以指向/bin/echo 并说“这是一个已编译的 C 程序,在那个文件中。”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2012-05-28
相关资源
最近更新 更多