你好,我在互联网上看到了一些解决方案,所有这些解决方案基本上都是在创建文件,但是我想将它们存储在char数组中。速度对我来说真的很重要,我不想花任何时间在硬盘上工作。因此popen()
对我来说不是真正的解决方案。
这里是有效的代码段:
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);
buffer[len-1] = '\0';
pclose(pipe);
[永远不要忘记Knuth所说的“过早的优化是万恶之源”。在执行任何操作之前,请不要担心性能,然后再measure。除极少数情况外,您的时间价值远高于程序运行的成本。
Jon Bentley的“编写有效的程序”(非常绝版,在他的"Programming Pearls"中,是一章的摘要)是关于如何使程序运行更快(如果值得的话)的详细讨论;并且,作为最后一项措施,要挤出最后可能的2%的性能(将运行时间减少一半),它建议您使用建议的更改。引用的书中包含一些非常有趣的关于“性能优化”的战争故事,这些故事完全是浪费的(优化从未使用过的代码,优化代码的运行,而操作系统却摇摇欲坠,...)。
如果您阅读popen的联机帮助页,则会注意到以下内容:
popen()函数通过创建管道,分叉,并调用外壳。 [...] popen()的返回值是普通标准I / O流在所有方面都必须用pclose()而不是fclose(3)关闭。 [...] “弹出”流读取命令的标准输出,并且命令的标准输入与该过程的标准输入相同称为popen()。
(重点是我的)
如您所见,对popen
的调用导致命令的stdout
通过I / O流]传递到程序中,这与磁盘I / O完全无关,而是使用操作系统管理的进程间通信。
(作为旁注:在合理范围内,依靠操作系统的基本功能来解决常见问题通常是一个好主意。并且由于popen
是POSIX.1-2001
的一部分,因此您可以依靠它来使用在所有符合标准的操作系统上,甚至在Windows上)
编辑:如果您想了解更多,请阅读:http://linux.die.net/man/3/popen
如果速度对您很重要,则可以编写自己的popen版本。
您介意拥有多个C程序吗?如果没有,则可以使用命令行参数。在第一个C程序中,您可以执行以下操作