在pipe道中获取命令输出,C为Linux

我需要运行一个Linux CLI命令,并从C中获取stdout输出

我可以使用pipe()来创build一个pipe道,然后fork / exec,在调用exec()之前将subprocess的stdout描述符redirect到pipe道中,并从父进程中的pipe道中读取数据。 另外我需要等孩子。

是否有一个简单的调用来做fork + redirect + exec + wait,就像system()做fork + exec + wait一样,只有system()不做redirect。

有popen(),它做叉+redirect+执行,但不做等待,所以我不能得到退出状态。

Solutions Collecting From Web of "在pipe道中获取命令输出,C为Linux"

是这个吗?

名称
        popen,pclose  - 进程I / O

概要
        #include <stdio.h>  

       文件* popen(常量字符*命令,常量字符*类型);

        int pclose(FILE * stream);

描述
        popen()函数通过创建管道,分叉, 
并调用shell。 由于管道按照定义是单向的, 
类型参数可以只指定读或写,而不是两个; 所结果的 
流是相应的只读或只写。

       命令参数是一个指向空字符串的指针 
包含一个shell命令行。 这个命令被传递给/ bin / sh 
使用-c标志; 如果有的话,解释是由shell执行的。  
 type参数是一个指向以null结尾的字符串的指针 
要么读“r”,要么写“w”。

        popen()的返回值是一个正常的标准I / O流 
所有方面保存它必须用pclose()而不是fclose()来关闭。  
写入这样的流写入命令的标准输入; 该 
命令的标准输出与调用的进程相同 
 popen(),除非这个命令本身改变了。 相反,阅读 
从一个“被动”的流中读取命令的标准输出, 
命令的标准输入与调用的进程相同 
 POPEN()。

       请注意,输出popen()流默认是完全缓冲的。

        pclose()函数等待关联进程终止 
并返回wait4()返回的命令的退出状态。

GLib有一个很好的功能 – g_spawn_sync() : http : g_spawn_sync()

例如,要运行命令并获取其退出状态并输出:

 const char *argv[] = { "your_command", NULL }; char *output = NULL; // will contain command output GError *error = NULL; int exit_status = 0; if (!g_spawn_sync(NULL, argv, NULL, 0, NULL, NULL, &output, NULL, &exit_status, &error)) { // handle error here } 

使用popen()pclose()


当然, popen()实际上并不等待,但是读取管道将阻塞,直到有数据可用。

pclose()等待,但过早调用可能会切断分叉进程的某些输出。 孩子完成后,您需要从流中确定…


可能已经在讨论如何从C运行一个外部程序并解析其输出?

这是我使用的:

  /* simply invoke a app, pipe output*/ pipe = popen(buf, "r" ); if (pipe == NULL ) { printf("invoking %s failed: %s\n", buf, strerror(errno)); return 1; } waitfor(10); while(!feof(pipe) ) { if( fgets( buf, 128, pipe ) != NULL ) { printf("%s\n", buf ); } } /* Close pipe */ rc = pclose(pipe);