如何在C/C++中将系统调用的输出重定向到程序内部?

Deb*_*ger 5 c++ string redirect system call

我正在用C++编写一个程序,它对Linux OS上当前目录中的所有文件进行了一些特殊处理.

所以我在考虑使用系统调用system("ls")来获取所有文件的列表.

但是如何将它存储在我的程序中呢?(如何重定向ls的输出,让我们说一个我在程序中声明的字符串)

谢谢

Sup*_*mes 14

共识似乎不是使用"ls".但是,对于任何对函数感兴趣的人来说:

/**
 * Execute a command and get the result.
 *
 * @param   cmd - The system command to run.
 * @return  The string command line output of the command.
 */
string GetStdoutFromCommand(string cmd) {

    string data;
    FILE * stream;
    const int max_buffer = 256;
    char buffer[max_buffer];
    cmd.append(" 2>&1"); // Do we want STDERR?

    stream = popen(cmd.c_str(), "r");
    if (stream) {
        while (!feof(stream))
            if (fgets(buffer, max_buffer, stream) != NULL) data.append(buffer);
        pclose(stream);
    }
    return data;
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*hen 10

我认为你不能使用系统来读取输出.

尝试使用popen.

   #include <stdio.h>

   FILE *popen(const char *command, const char *type);

   int pclose(FILE *stream);
Run Code Online (Sandbox Code Playgroud)

但是,你可能不想这样做ls.两个原因:

  • 如果要获取目录列表,请使用文件系统api direct(readdir),而不是使用shell命令并解析它.
  • 有人指着我最近解释为什么解析输出是一个坏主意的博客文章ls.


Dou*_*der 7

我建议你不要打电话ls- 正确地完成工作,opendir/readdir/closedir用来直接读取目录.

代码示例,打印目录条目:

// $ gcc *.c && ./a.out 
#include <stdlib.h> // NULL
#include <stdio.h>  
#include <dirent.h>

int main(int argc, char* argv[]) {
  const char* path = argc <= 1 ? "." : argv[1];

  DIR* d = opendir(path);
  if (d == NULL) return EXIT_FAILURE;

  for(struct dirent *de = NULL; (de = readdir(d)) != NULL; )
    printf("%s/%s\n", path, de->d_name);

  closedir(d);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,不应在多线程程序中使用`readdir`.相反,你应该使用`readdir_r` (2认同)