使用popen 方法
popen()可以执行shell命令,并读取此命令的返回值; 与pclose函数配对使用。
头文件
#include <stdio.h>
函数定义
FILE
* popen (
const
char
* command ,
const
char
* type );
int
pclose (
FILE
* stream );
函数说明
popen() 函数fork一个子进程,并在二者间创建一个管道并返回一个指向流的指针fd,该流可用于读取或写入管道。子进程启动shell环境执行command
指定的命令,结果写入管道。
由于管道是单向的,type
参数可以指定仅读取或写,而不是两者兼而有之;结果流被相应地只读或只写。
这个fd必须由 pclose() 函数关闭,而不是 fclose() 函数。pclose() 函数关闭标准 I/O 流,等待命令执行结束,然后返回 shell 的终止状态。如果 shell 不能被执行,则 pclose() 返回的终止状态与 shell 已执行 exit 一样。
popen(3) - Linux manual page
type "r" 则文件指针连接到 command 的标准输出; "w" 则文件指针连接到 command 的标准输入。
command 执行的命令。(以NULL结尾)
返回值
如果调用 fork() 或 pipe() 失败,或者不能分配内存将返回NULL,否则返回标准 I/O 流。
返回错误
popen 没有为内存分配失败设置 errno 值。
如果调用 fork() 或 pipe() 时出现错误,errno 被设为相应的错误类型。
如果 type 参数不合法,errno将返回EINVAL。
例子
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
void
print_result(FILE *fp)
{
char buf[100];
if(!fp) {
return;
}
printf("\n>>>\n");
while(memset(buf, 0, sizeof(buf)), fgets(buf, sizeof(buf) - 1, fp) != 0 ) {
printf("%s", buf);
}
printf("\n<<<\n");
}
int
main(void)
{
FILE *fp = NULL;
while(1) {
fp = NULL;
fp = popen("ls", "r");
if(!fp) {
perror("popen");
exit(EXIT_FAILURE);
}
print_result(fp);
pclose(fp);
sleep(1);
}
}
注意事项
popen 会fork 子进程,所以注意系统对资源的限制是否会影响。
popen 里面执行shell命令时,如果不是给的绝对路径,则需要注意systemctl 启动的时候 *.service的环境变量配置,否则可能找不到命令而执行不了。
其他方法:
C++ 执行cmd命令 并读取输出 -
C或C++如何通过程序执行shell命令并获取命令执行结果?