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

时间:2009-03-22 19:10:01

标签: c++ linux command-line

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

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

ls -la

我该怎么做?

4 个答案:

答案 0 :(得分:22)

使用popen功能。

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

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

答案 1 :(得分: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 );
}

答案 2 :(得分:15)

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

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

答案 3 :(得分:1)

使用 系统(“ls -la”) 功能