【问题标题】:How to execute a command and read its output in C如何在 C 中执行命令并读取其输出
【发布时间】:2016-03-16 14:55:51
【问题描述】:

我想使用以下命令查找路径名:

system("which");

然后我将输出用作execv() 函数的参数。我怎样才能做到这一点?有什么建议吗?

【问题讨论】:

  • 不要使用system,而是使用popen
  • 但我必须使用系统@Jean-BaptisteYunès
  • 您无法轻易获得system 运行的命令在输出中产生的内容,它不是为此而设计的。为什么要以这种方式定位它?让execvp 为您完成这项工作......
  • 不用which,你可以解析环境PATH。使用strtok(),获取每个路径并检查从PATH 提取的每个路径中是否存在命令。或者使用execvpe()execle()并传递环境,其中包括PATH

标签: c unix system execv


【解决方案1】:

您正试图以错误的方式解决它。 which 使用PATH 变量来定位给定的可执行文件。使用which 获取路径然后将其传递给execv() 是不必要的,因为exec* 的另一个变体也可以做到这一点:execvp()


要读取命令的输出,可以使用popen()

#include <limits.h>
#include <stdio.h>


char str[LINE_MAX];
FILE *fp = popen("which ls", "r");

if (fp == NULL) {
   /* error */
}

if(fgets(str, sizeof str, fp) == NULL) {
   /* error */
}

/*remove the trailing newline, if any */
char *p = strchr(str, '\n');
if (p) *p = 0; 

如果您的二进制文件在某个缓冲区中,那么您可以使用snprintf() 形成popen() 的第一个参数。

【讨论】:

  • 这是一个编程任务,我必须使用 which 和 execv()
  • 嗯。如果你真的想这样做,你可以使用popen()fgets()
  • @esrtr - 如果你坚持使用system()which,你必须在子进程和父进程之间创建一个管道。将子进程的stdout设置为管道的写端。在父进程上,从管道中读取以获取which cmd 的输出。现在有了这个输出,你可以调用execvp()
  • 我可以使用 system() 。不是弹出()。我怎样才能做到这一点?可能吗? @l3x
  • @esrtr 您的要求不寻常。 system() 就是做不到。你可以按照 alvits 的建议去做。
最近更新 更多