我意识到这也许是一个奇怪的问题,但是如果说我有一个可以向系统发送命令的程序,例如:
system(command);
该程序可以通过“ls -l”等参数运行并向其他程序发送命令。
但是,如果我有一个需要交互式输入的程序,例如使用 scanf,是否有一种简单的方法可以使我的 C 程序有效地与之交互。
对难以解释我的要求表示歉意。这是一个技术问题的练习,原因我无法简明地解释。
是否有一种简单的方法可以使我的 C 程序有效地与之交互。
是的,您可能正在寻找popen(3)
. 它允许你运行一个命令并给你一个FILE *
附加到它的stdin
/ stdout
。
可悲的是,在 Linux 上它是单向的:stdin或stdout,而不是同时两者。至少一个其他实现(FreeBSD)允许双向管道。
通常,您会使用以下模式:
pipe()
打开一对将用作子进程的标准输入的文件描述符。(或pipe2()
在linux下)pipe()
打开一对将用作子进程的标准输出的文件描述符。fork()
。您现在有两个进程,父进程和一个新的子进程。fork() == 0
)
dup2()
从上面步骤 1 和 2 中创建的文件描述符创建新的 STDIN_FILENO 和 STDOUT_FILENO。exec()
功能来启动您的新程序。fork() > 0
)
waitpid()
您还可以通过创建第三个管道并将dup2()
其添加到 STDERR_FILENO 来从子进程中捕获 stderr
man pipe
有一段代码显示如何使用管道。还有其他这种模式的例子