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

问题描述 投票:1回答:5

你好,我在互联网上看到了一些解决方案,所有这些解决方案基本上都是在创建文件,但是我想将它们存储在char数组中。速度对我来说真的很重要,我不想花任何时间在硬盘上工作。因此popen()对我来说不是真正的解决方案。

c linux bash command
5个回答
3
投票

这里是有效的代码段:

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);

2
投票

[永远不要忘记Knuth所说的“过早的优化是万恶之源”。在执行任何操作之前,请不要担心性能,然后再measure。除极少数情况外,您的时间价值远高于程序运行的成本。

Jon Bentley的“编写有效的程序”(非常绝版,在他的"Programming Pearls"中,是一章的摘要)是关于如何使程序运行更快(如果值得的话)的详细讨论;并且,作为最后一项措施,要挤出最后可能的2%的性能(将运行时间减少一半),它建议您使用建议的更改。引用的书中包含一些非常有趣的关于“性能优化”的战争故事,这些故事完全是浪费的(优化从未使用过的代码,优化代码的运行,而操作系统却摇摇欲坠,...)。


1
投票

如果您阅读popen的联机帮助页,则会注意到以下内容:

popen()函数通过创建管道,分叉,并调用外壳。 [...] popen()的返回值是普通标准I / O流在所有方面都必须用pclose()而不是fclose(3)关闭。 [...] “弹出”流读取命令的标准输出,并且命令的标准输入与该过程的标准输入相同称为popen()。

(重点是我的)

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

(作为旁注:在合理范围内,依靠操作系统的基本功能来解决常见问题通常是一个好主意。并且由于popenPOSIX.1-2001的一部分,因此您可以依靠它来使用在所有符合标准的操作系统上,甚至在Windows上)

编辑:如果您想了解更多,请阅读:http://linux.die.net/man/3/popen


0
投票

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.