我正在寻找一个C接口的bash炮弹。即我希望有一组函数允许我打开会话,执行命令,返回输出(STDOUT,STDERR),最后关闭shell。它可以是基于标准库的库或C源代码。C-接口交互的bash
回答
你希望获得这样的事情:
#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
呼叫可以在一个循环中获得。
当然,但这不会有持久的环境。 OP最关心的可能是这个。 – 2012-07-05 11:21:16
是的。例如,所有的shell变量都应该在后续命令之间保留。 – highsciguy 2012-07-05 16:27:53
一般根本的问题似乎是如何以编程方式运行交互式终端程序。
现在,这会在我的部分需要实际测试,但你大概需要
- 创建对应于子进程
stdin
,stdout
,并stderr
(父进程写入和阅读stdout_pipe
和stderr_pipe
)使用pipe(2)
系统调用; - fork和子女close通过调用
dup2(2)
将标准输入,输出和错误重定向到上述管道的适当端; - EXEC(
execve(2)
/execv(3)
)你的交互shell; - 从其他两个管开始writing命令
stdin_pipe
和reading错误和响应。
(如果你不需要做stdout
和stderr
之间的区别,你可以只用popen(3)
简化你的生活 - 你很可能通过命令字符串的正确选择重定向到stderr
stdout
)。
但是,对于正常工作的解决方案,我相信你可能需要使用伪ttys(pty(7)
)通过调用forkpty(3)
而不是fork。
当它开始变得越来越复杂,考虑到处理伪终端的所有nyances,为什么不搜索对于C期望库,应该能够做到这一切为您服务。或者模拟expect或其他一些与pexpect
等效的语言是如何实现的。实际上expect
似乎为您提供了一个名为libexpect(3)
的C库,因此您不需要编写tcl/tk来编程交互。我对图书馆并不熟悉,可能还有其他更好的图书馆。
你几乎可以肯定需要使用ptys。 – 2012-07-06 02:50:03
@JonathanLeffler - 对于更复杂的场景是的,当然。例如,如果用shell运行的程序需要关于终端的信息(比如'ls'的列数)。我认为简单的shell命令可能仍然可以通过基于普通的'popen(3)'+'pclose(3)'方法(设置环境变量,运行不关心终端的程序)来运行。原则上,我不明白为什么像bash这样的shell不应该允许在没有tty的情况下交互地使用它们(尽管它们确实检查是否使用tty运行它们并相应地调整行为)。 – FooF 2012-07-06 03:09:12
- 1. 调用Bash交互
- 2. C#交互式窗口可以与我的代码交互吗?
- 3. 与Python的bash交互
- 4. 交互式bash脚本
- 5. C#交互式窗口缺失方法
- 6. 窗口交互性
- 7. Bash交互式和非交互式shell行为
- 8. 的Javascript交叉窗口交互
- 9. 禁用窗口交互iOS
- 10. bash脚本回答交互式提示
- 11. Windows git bash交互式不起作用?
- 12. 如何解决这个bash python交互?
- 13. Bash脚本交互式mv问题
- 14. 如何重用连接到网格的交互和交互
- 15. 带宽接口端口的Bash脚本
- 16. C++ GNU-Plot在x11窗口中是非交互的
- 17. 如何让动作与win32窗口中的C++交互?
- 18. 交互式C#控制台作为立即窗口的替代
- 19. C#交互式窗口不会引用我的代码
- 20. 两个c/C++程序的交互
- 21. 直接与语音交互?
- 22. 与C++进行交互
- 23. C#Runspace Powershell(交互式)
- 24. 在C硬件交互
- 25. 通过C#与IIS交互
- 26. 跨线程交互c#
- 27. 与Facebook C#SDK交互
- 28. C#交互式绘图#
- 29. Javascript和C#COM交互
- 30. 使用C交互MS Access#
我不知道有任何这样的接口。你的用例是什么?任何事先未知的命令集可能会变成一个丑陋的脆弱黑客。 – 2012-07-05 11:22:54
@highsciguy似乎正在寻找像C库一样的[expect](http://expect.sourceforge.net/)。 – FooF 2012-07-05 12:00:59
为什么?无论如何,最简单的方法(获得持久化环境)将写出一个shell脚本到一个文件,然后使用'system'执行它。好吧,管道会更快,但你不需要快速,否则你根本不会使用外壳。 – cdarke 2012-07-05 12:09:57