执行bash命令并获取C中的输出

你好我已经看到在互联网上的一些解决scheme,所有这些都基本上创build一个文件,但是我想存储在一个字符数组中。 速度对我来说非常重要,我不想花时间在硬盘上工作。 所以popen()对我来说不是一个真正的解决scheme。

这是一个工作代码片段:

 char bash_cmd[256] = "ls -l": char buffer[1000]; FILE *pipe; int len; pipe = popen(bash_cmd, "r"); if (NULL == pipe) { perror("pipe"); exit(1); } fgets(buffer, sizeof(buffer), pipe); len = strlen(bash_cmd); bash_cmd[len-1] = '\0'; pclose(pipe); 

永远不要忘记克努特所说的“不成熟的优化是万恶之源”。 重要的是不要担心表现,然后在做任何事情之前进行测量 。 除非常罕见的情况外,您的时间价值远高于程序运行的成本。

Jon Bentley的“编写高效的程序”(可惜绝版,在他的“编程珍珠”一章中是一个总结)是关于如何使程序运行得更快(如果是值得的)的详细讨论。 只是作为最后一项措施,挤出最后可能的2%的性能(减少运行时间后减半),建议使用像你所建议的变化。 引用的书包括一些非常有趣的“性能优化”的战争故事,这些故事是一个完全的浪费(优化代码,以前没有用过,优化代码运行,而操作系统旋转拇指,…)。

如果你想阅读popen的手册,你会注意到:

popen()函数通过创建管道,分叉和调用shell来打开一个进程。 […] popen()的返回值在所有方面都是正常的标准I / O流,除了它必须用pclose()而不是fclose(3)来关闭。 从“popened”流中读取命令的标准输出 ,命令的标准输入与调用popen()的过程相同。

(重点是我的)

正如您所看到的,对popen的调用导致命令的stdout通过I / O流传送到您的程序中, I / O流完全与磁盘I / O无关,而是由操作管理的进程间通信系统。

(作为一个注释:在合理的范围内依靠操作系统的基本功能来解决常见的问题通常是一个好主意,而且由于popenPOSIX.1-2001一部分,所以你可以依靠它来在所有符合标准的操作系统,甚至窗口)

编辑:如果你想知道更多,请阅读: http : //linux.die.net/man/3/popen

如果速度对你很重要,你可以写你自己的popen版本。

这可能是有道理的,因为popen() – 创建一个管道 – 叉 – 执行shell(非常昂贵!) – shell创建一个管道,分叉,执行你的程序

您的自定义版本可以减少程序: – 创建一个管道 – 叉子 – 执行你的程序

你甚至可以扩展popen来分别控制命令STDOUT,STDERR和STDIN。 我写了这样的例程,请参阅https://github.com/rockdaboot/mget/blob/master/libmget/pipe.c它是GPL的。

你可以用FILE指针调用mget_popen3(),或者用文件描述符调用mget_fd_popen3()。 至少,它应该给你一个想法如何做到这一点。

你介意有多个C程序吗?如果你不这样做,你可以使用命令行参数。 在第一个C程序中,您可以执行以下操作

 system("YourCommand | SecondProgram"); 

SecondProgram将是您将要编写的第二个C程序的“可执行文件”。 在第二个C程序中,您可以接收命令YourCommand的输出作为YourCommand中的命令行参数。 为此目的,你可以开始第二个C程序的main(),如下所示

 main(int argc,char *argv[]) 

数组argv将具有YourCommand的输出, argc将包含数组argv的元素数。