用于交互式bash的C接口

时间:2012-07-05 10:53:25

标签: c linux bash

我正在为bash shell搜索一个C接口。即我想有一组函数允许我打开一个会话,执行命令,返回输出(STDOUT,STDERR),最后关闭shell。它可以是基于标准库的库或C源代码。

2 个答案:

答案 0 :(得分:1)

一般根问题似乎是如何以编程方式运行交互式终端程序

现在我需要进行实际测试,但你需要

  1. 创建与子流程stdinstdoutstderr相对应的三个pipes(父流程写入stdin_pipe并阅读stdout_pipestderr_pipe)使用pipe(2)系统调用;
  2. fork并在子close中通过调用dup2(2)将标准输入,输出和错误重定向到上述管道的正确末端;
  3. exec(execve(2) / execv(3))您的互动外壳;
  4. 启动writing命令stdin_pipereading来自其他两个管道的错误和响应。
  5. (如果您不需要区分stdoutstderr,可以使用popen(3)简化您的生活 - 您可以将stderr重定向到{ {1}}通过正确选择命令字符串)。

    但是,对于正常工作的解决方案,我相信您可能需要通过调用pty(7)而不是fork来使用伪ttys(forkpty(3))。

    考虑到处理伪终端的所有问题,开始变得越来越复杂,为什么不搜索C expect库,它应该能够为你完成所有这些。或者模拟expect或其他语言如pexpect的实现方式。实际上stdout似乎为您提供了一个名为libexpect(3)的C库,因此您无需编写tcl / tk来编写交互。我并不熟悉图书馆,可能还有其他更好的图书馆。

答案 1 :(得分:0)

您是否希望实现以下目标:

    #include<stdio.h>
    int main()
    {
      char a[1000];
      gets(a);
      system(a);
      return 0;
    }

输出:

./a.out
cat testing.c
#include<stdio.h>
int main()
{
  char a[1000];
  gets(a);
  system(a);
  return 0;
}

gets()system调用可以进入循环。