Linux基础学习2
- popen函数
popen函数
https://blog.csdn.net/yzy1103203312/article/details/78483566
https://blog.csdn.net/xy1413_/article/details/127135608
典型用法:
FILE * fp = popen("ifconfig eth0", "r");
if (!fp) {
fprintf(stderr, "Erro to popen");
}
while (fgets(buf, BUF_SIZE, fp) != NULL) {
fprintf(stdout, "%s", buf);
}
pclose(p_file); // 注意这里相当于同步等待popen的子进程命令执行完毕
注意:
popen返回的fp是标准输入输出流对象,也就是说当模式是"r"时通过fp能读到其它所有进程写到标准输出流中的内容,所以上面的while (fgets)循环,可能会读到其它子进程的输出命令,读到的EOF或者命令执行出错也可能是来自其它进程的(只是概率比较低)。
真正能保证popen要执行的命令能完成的是下面的pclose(),它会同步等待子进程退出,从而能保证命令真正执行完毕。
另外,在使用popen函数执行命令时,调用fgets函数时会读取到EOF的情况有以下几种:
-
子进程执行完毕,关闭了标准输出流,此时fgets函数会读取到EOF。
-
父进程关闭了popen返回的文件指针,此时fgets函数会读取到EOF。
-
发生了错误,例如子进程意外终止或者popen函数调用失败,此时fgets函数会读取到EOF。
需要注意的是,如果命令执行过程中没有输出,fgets函数不会读取到EOF,而是会一直阻塞等待输入。因此,在使用popen函数时,需要注意处理fgets函数读取到EOF的情况,以避免程序出现异常。