捕获 system() 命令的标准输出的最佳方法。

11 浏览
0 Comments

捕获 system() 命令的标准输出的最佳方法。

我正在尝试通过system()来启动一个外部应用程序 - 例如system("ls")。我希望能够实时捕获其输出,以便将其发送给另一个函数进行进一步处理。在C/C++中,有什么最好的方法来实现这个?

0
0 Comments

从上述内容中,我们可以了解到(Capturing stdout from a system() command optimally)这个问题的出现的原因是想要从system()命令中捕获标准输出。解决方法有以下几种:

1. 可以使用system("ls > tempfile.txt")将输出重定向到一个临时文件中,但是选择一个安全的临时文件比较麻烦。

2. 可以通过将输出重定向到另一个程序来实现,如system("ls | otherprogram")。

3. 可以使用popen()命令来处理输出,具体做法是使用FILE *output = popen("ls", "r");,这将返回一个文件指针,可以从中读取命令的输出。

4. 还可以使用pipe()调用来创建连接,并结合fork()创建新进程,使用dup2()来改变它们的标准输入和输出,使用exec()来运行新程序,并在主程序中使用wait()等待它们的完成。这相当于设置一个类似于shell的管道。具体的细节和示例可以参考pipe()的man页。

以上是解决(Capturing stdout from a system() command optimally)问题的几种方法。

0
0 Comments

从上述内容可以看出,问题的出现是因为需要从system()命令中捕获标准输出,并将其保存到一个变量中。而system()命令本身并不提供直接的方法来实现这个功能。

为了解决这个问题,可以使用popen()函数。该函数可以执行一个命令,类似于system(),但是可以将输出重定向到一个新文件中,并返回一个指向该文件的指针。通过使用popen()函数,我们可以将标准输出保存到一个变量中。

下面是一个示例代码:

FILE *lsofFile_p = popen("lsof", "r");

if (!lsofFile_p)

{

return -1;

}

char buffer[1024];

char *line_p = fgets(buffer, sizeof(buffer), lsofFile_p);

pclose(lsofFile_p);

在上面的代码中,我们使用popen()函数执行了一个命令"lsof",并将输出保存到一个文件中。然后我们使用fgets()函数从文件中读取一行内容,并将其保存到一个变量中。最后,我们使用pclose()函数关闭文件指针。

通过使用popen()函数,我们可以优化地捕获system()命令的标准输出,并将其保存到一个变量中,从而解决了问题。

0
0 Comments

问题的原因:

该问题的原因是在使用system()命令时无法捕获标准输出(stdout)。在POSIX系统中,可以使用popen()函数来捕获stdout,但在Windows系统中没有popen()函数,而是有一个类似功能的函数_popen()。

解决方法:

对于POSIX系统,可以使用popen()函数来捕获stdout。例如:

#include 
#include 
int main(void) {
    FILE *fp;
    char buffer[1024];
    
    fp = popen("command", "r");
    if (fp == NULL) {
        printf("Failed to run command\n");
        exit(1);
    }
    
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }
    
    pclose(fp);
    
    return 0;
}

对于Windows系统,可以使用_popen()函数来捕获stdout。例如:

#include 
#include 
int main(void) {
    FILE *fp;
    char buffer[1024];
    
    fp = _popen("command", "r");
    if (fp == NULL) {
        printf("Failed to run command\n");
        exit(1);
    }
    
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }
    
    _pclose(fp);
    
    return 0;
}

0