【问题标题】:Open the terminal and execute commands via C programming打开终端并通过 C 编程执行命令
【发布时间】:2014-02-18 23:28:01
【问题描述】:

有人知道如何使用 C 程序打开终端并执行多个命令吗?

我有一个 C 语言程序和另一组由终端执行的命令。我需要将它们组合成一个 C 程序。

我使用的是 Ubuntu 10.04。

谢谢!

【问题讨论】:

标签: c++ c ubuntu terminal ubuntu-10.04


【解决方案1】:

您的问题可能有些误导。

因为您想在 c 代码中运行所有终端命令,也许您实际上只有这些命令的文本输入/输出。如果是这样,您可能不需要终端。


当(终端)程序的输出是文本流时,我使用 popen。它可能是最容易使用的。举个例子:

 ...
 const char* cmndStr = "ls -lsa";
 FILE* pipe = popen(cmndStr, "r");
 ...

popen 指令执行 cmndStr 中的命令,写入命令 (ls -lsa) 标准输出的任何文本都被重定向到管道,然后可供 C 程序读取。

popen 打开一个单独的进程(但没有可以工作的终端,只有管道)

'Fork' 是另一种启动单独进程的方式,可以对启动的进程的 std i/o 进行一些控制,但同样,我认为不是终端。


另一方面,如果您的输出不是简单的文本流,也许您可​​以使用仅输出的专用终端屏幕来适应特殊的输出活动。例如,当我使用 ncurses 时:

我以常规方式手动打开一个终端,并在终端中

  • 发出命令“tty”找出设备名称,然后

  • 发出“cd”以将焦点设置到工作目录。

    dmoen@C5:~$ tty

    /dev/pts/1

    dmoen@C5:~$ cd 工作

    dmoen@C5:~/work$

然后我启动我的程序(在不同的 tty 中),并让程序知道我希望它使用哪个设备来进行特殊输出(即 /dev/pts/1 )......我通常使用命令行参数来告诉我的程序我希望它使用哪些 pts 或额外的终端,但存在环境变量、管道、输入/输出重定向和其他选择。

我没有尝试(最近)启动终端(如 smrt28 所建议的那样),除了在 shell 中。我相信这会起作用,但我看不到终端命令(示例中的 ls )的输出将如何传递回您的程序。 popen 简单地传递一个文本流。

很久以前,我使用了一个名为“pty”的设备,它的工作原理类似于终端,但我不记得如何有效地连接它。


有一组 'exec' 命令...见 man exec。要将它们连接回您的程序,您可能会使用文件,或者重定向 i/o。选择太多,无法在此处列出。


另外,也许您可​​以使用 shell 管道将这些命令与您的 c 程序连接起来。

【讨论】:

  • 好的,我会更具体地使用 gstreamer(服务器和客户端),我使用终端运行 gstreamer 命令(管道)。我还有 C 程序(服务器和客户端),客户端使用 TCP 向服务器发送一些数据。现在我需要将这些程序合并到一个 C 程序中,并使用 C 程序运行管道(客户端和服务器)。
  • 管道命令示例(服务器端):gst-launch videotestsrc ! ffenc_mpeg4 ! rtpmp4vpay! udpsink 主机=127.0.0.1 端口=5000
【解决方案2】:

勾选“man xterm”,参数-e。然后,在 C 中,您可以:

system("xterm -e ls")

【讨论】:

    最近更新 更多