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

时间:2013-01-18 06:46:50

标签: c linux bash command

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

5 个答案:

答案 0 :(得分:2)

以下是一个有效的代码段:

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

答案 1 :(得分:2)

永远不要忘记Knuth说“过早优化是所有邪恶的根源”。在重要之前不要担心性能,然后在做任何事情之前测量。除非常罕见的情况,您的时间价值远远高于程序运行的成本。

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

答案 2 :(得分:1)

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

  

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

(强调我的)

正如您所看到的,拨打popen会导致命令的stdout通过 I / O流传输到您的程序中,该命令无效完全使用磁盘I / O,而是使用操作系统管理的进程间通信。

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

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

答案 3 :(得分:0)

如果速度对您很重要,您可以编写自己的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()。 至少,它应该让你知道如何做到这一点。

答案 4 :(得分:-1)

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

system("YourCommand | SecondProgram");

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

main(int argc,char *argv[])

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