如何在C++/Linux中执行外部命令?

Lip*_*pis 20 c++ linux command-line

我只是想知道哪种是在C++中执行外部命令的最佳方法,如果有的话我如何获取输出?

编辑:我猜我必须告诉我这个世界上我是新手,所以我想我需要一个有效的例子.例如,我想执行如下命令:

ls -la
Run Code Online (Sandbox Code Playgroud)

我怎么做?

Meh*_*ari 23

使用该popen功能.

示例(不完整,生产质量代码,无错误处理):

FILE* file = popen("ls", "r");
// use fscanf to read:
char buffer[100];
fscanf(file, "%100s", buffer);
pclose(file);
Run Code Online (Sandbox Code Playgroud)

  • @Daniel这不是生产代码.这是一个在线论坛上的答案,该论坛应该给出一个关于popen函数及其论点的高级概念.任何习惯将所有Stack Overflow答案视为生产代码的人都有比这更严重的问题.此外,任何有可能溢出的缓冲区都不是严重的严重安全威胁.如果没有特定的威胁模型并且知道什么是可信任的以及在特定环境中没有应用什么,那么关于安全性的讨论就没有实际意义. (10认同)
  • ......我觉得这个答案对于那些可以解决其余问题的人来说非常有帮助.这就是我写它的原因.是的,它并不完美.这就是为什么Stack Overflow具有所有这些不错的功能,以便您可以评论要注意的事情,或者更好的是,编辑或贡献自己的更好的答案,而不是对其他志愿者贡献者发起ad-hominem攻击.考虑到我发布了明确暗示建议不要直接在生产代码中使用的警告,这尤其令人失望. (6认同)
  • @MehrdadAfshari你太善良了,没有更新你的答案; 我希望人们注意到. (3认同)
  • @Daniel我认为当时(以及今天)很清楚,由于许多原因,通常执行外部命令并不是生产中的好习惯,原因之一是您可以简单地将命令更改为还有其他的东西..所以这几乎是常识..甚至无需提及任何其他内容(列表可能很大),因为它可以准确地回答所要询问的内容!我什至将答案恢复为原始的:) (2认同)

小智 20

一个例子:

#include <stdio.h>

int main() {
    FILE * f = popen( "ls -al", "r" );
    if ( f == 0 ) {
        fprintf( stderr, "Could not execute\n" );
        return 1;
    }
    const int BUFSIZE = 1000;
    char buf[ BUFSIZE ];
    while( fgets( buf, BUFSIZE,  f ) ) {
        fprintf( stdout, "%s", buf  );
    }
    pclose( f );
}
Run Code Online (Sandbox Code Playgroud)

  • @Dave Jarvis请不要随意添加不必要的代码来"改进"我的答案. (4认同)
  • C++不需要在main结束时返回. (3认同)
  • wget将其状态消息写入stderr - 使用--quiet选项运行它 (3认同)

Pet*_*acs 16

popen 绝对是你正在寻找的工作,但它有一些缺点:

  • 它会对您正在执行的命令调用shell(这意味着您需要解开任何用户提供的命令字符串)
  • 它只能在一个方向上工作,要么您可以为子进程提供输入,要么您可以读取其输出.

如果要调用子进程并提供输入和捕获输出,那么您必须执行以下操作:

int Input[2], Output[2];

pipe( Input );
pipe( Output );

if( fork() )
{
    // We're in the parent here.
    // Close the reading end of the input pipe.
    close( Input[ 0 ] );
    // Close the writing end of the output pipe
    close( Output[ 1 ] );

    // Here we can interact with the subprocess.  Write to the subprocesses stdin via Input[ 1 ], and read from the subprocesses stdout via Output[ 0 ].
    ...
}
else
{    // We're in the child here.
     close( Input[ 1 ] );
     dup2( Input[ 0 ], STDIN_FILENO );
     close( Output[ 0 ] );
     dup2( Output[ 1 ], STDOUT_FILENO );

     execlp( "ls", "-la", NULL );
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以根据需要替换execlp任何其他exec函数.