Linux基础学习2

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(),它会同步等待子进程退出,从而能保证命令真正执行完毕。
Linux基础学习2_第1张图片

另外,在使用popen函数执行命令时,调用fgets函数时会读取到EOF的情况有以下几种:

  1. 子进程执行完毕,关闭了标准输出流,此时fgets函数会读取到EOF。

  2. 父进程关闭了popen返回的文件指针,此时fgets函数会读取到EOF。

  3. 发生了错误,例如子进程意外终止或者popen函数调用失败,此时fgets函数会读取到EOF。

需要注意的是,如果命令执行过程中没有输出,fgets函数不会读取到EOF,而是会一直阻塞等待输入。因此,在使用popen函数时,需要注意处理fgets函数读取到EOF的情况,以避免程序出现异常。

你可能感兴趣的:(linux,运维,服务器)