用于交互式 bash 的 C 接口(interface)

标签 c linux bash

我正在为 bash shell 寻找 C 接口(interface)。 IE。我想要一组函数,允许我打开 session 、执行命令、返回输出(STDOUT、STDERR)并最终关闭 shell。它可以是库或基于标准库的 C 源代码。

最佳答案

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

现在这对我来说需要实际测试,但您大致需要

  1. 创建三个 pipes对应子进程stdinstdoutstderr(父进程写stdin_pipe,读 stdout_pipestderr_pipe)使用 pipe(2)系统调用;
  2. fork在 child 身上close通过调用 dup2(2) 将标准输入、输出和错误重定向到上述管道的正确末端;
  3. exec ( execve(2)/execv(3) ) 您的交互式 shell;
  4. 开始writing stdin_pipereading 命令来自其他两个管道的错误和响应。

(如果您不需要区分 stdoutstderr,您可以使用 popen(3) 来简化您的生活 - 您可能可以重定向 通过正确选择命令字符串将 stderr 转换为 stdout

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

考虑到处理伪终端的所有细节开始变得越来越复杂,为什么不搜索应该能够为您完成所有这些的 C 期望库。或者模拟如何 expect或其他一些等效的语言,如 pexpect实现。实际上 expect 似乎提供了一个名为 libexpect(3) 的 C 库为你这样你就不需要编写 tcl/tk 来对交互进行编程。我个人对图书馆并不熟悉,可能还有其他更好的图书馆。

关于用于交互式 bash 的 C 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11342868/

相关文章:

bash - 如何在 Bash 脚本中捕获退出代码

linux - 如何使用 bash 命令将文件名列表写入 .lst 文件

python - 在 Raspi 上使用带有 Python 的 C 库

linux - 在没有 super 用户的情况下重新启动apache

c - 如何从C中的完整路径获取文件的目录

linux - linux 中的 mprotect

linux - 在 SCHED_DEADLINE 调度程序下 sched_yield() 保证在下一个周期开始时唤醒?

r - 将多个大型 csv 文件合并(rbind)为一个具有不同列顺序的文件

c++ - struct声明中的冒号是什么意思,如:1, :7, :16,或:32?

c - 如何在不同的库(.a)中编译具有相同变量名的c代码