1

我意识到这也许是一个奇怪的问题,但是如果说我有一个可以向系统发送命令的程序,例如:

system(command);

该程序可以通过“ls -l”等参数运行并向其他程序发送命令。

但是,如果我有一个需要交互式输入的程序,例如使用 scanf,是否有一种简单的方法可以使我的 C 程序有效地与之交互。

对难以解释我的要求表示歉意。这是一个技术问题的练习,原因我无法简明地解释。

4

2 回答 2

2

是否有一种简单的方法可以使我的 C 程序有效地与之交互。

是的,您可能正在寻找popen(3). 它允许你运行一个命令并给你一个FILE *附加到它的stdin/ stdout

可悲的是,在 Linux 上它是单向的:stdinstdout,而不是同时两者。至少一个其他实现(FreeBSD)允许双向管道。

于 2013-01-08T20:23:44.977 回答
1

通常,您会使用以下模式:

  1. 用于pipe()打开一对将用作子进程的标准输入的文件描述符。(或pipe2()在linux下)
  2. 用于pipe()打开一对将用作子进程的标准输出的文件描述符。
  3. 打电话fork()。您现在有两个进程,父进程和一个新的子进程。
  4. 在子进程中(即。fork() == 0
    1. 用于dup2()从上面步骤 1 和 2 中创建的文件描述符创建新的 STDIN_FILENO 和 STDOUT_FILENO。
    2. 使用其中一项exec()功能来启动您的新程序。
  5. 在父进程中(即。fork() > 0
    1. 关闭在上述步骤 1 和 2 中创建的管道的未使用侧。
    2. 检测子进程终止,使用waitpid()
    3. 关闭管道文件描述符的其余部分。

您还可以通过创建第三个管道并将dup2()其添加到 STDERR_FILENO 来从子进程中捕获 stderr

man pipe有一段代码显示如何使用管道。还有其他这种模式的例子

于 2013-01-08T23:14:04.313 回答