C可以捕获stdin / out与其他程序交互,就好像它正在使用shell一样吗?

时间:2013-01-08 20:22:21

标签: c linux

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

system(command);

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

但是,如果我有一个需要交互式输入的程序,例如使用scanf,是否有一种直接的方法来使我的C程序能够有效地与它进行交互。

难以解释我的请求。这是一项技术问题的练习,原因我无法简明扼要解释。

2 个答案:

答案 0 :(得分:2)

  

是否有一种直接的方法来启用我的C程序   有效地与之互动。

是的,您可能正在寻找popen(3)。它允许您运行命令,并为其FILE * / stdin添加stdout

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

答案 1 :(得分:1)

通常您会使用以下模式:

  1. 使用pipe()打开一对文件描述符,这些描述符将用作子进程的stdin。 (或linux下的pipe2()
  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. 检测子进程终止
    4. 关闭管道文件描述符的其余部分。
  6. 您还可以通过创建第3个管道并dup2()将其添加到STDERR_FILENO

    来捕获子进程中的stderr

    man pipe有一段代码,展示了如何使用管道。此模式还有其他examples