您的问题可能有些误导。
因为您想在 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 程序连接起来。