捕获 system() 命令的标准输出的最佳方法。
从上述内容中,我们可以了解到(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)问题的几种方法。
从上述内容可以看出,问题的出现是因为需要从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()命令的标准输出,并将其保存到一个变量中,从而解决了问题。
问题的原因:
该问题的原因是在使用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; }