• 《popen和system的区别》


    popen和system都可以执行外部命令。
    popen相当于是先创建一个管道,fork,关闭管道的一端,执行exec,返回一个标准的io文件指针。
    system相当于是先后调用了fork, exec,waitpid来执行外部命令
    popen本身是不阻塞的,要通过标准io的读取使它阻塞
    system本身就是阻塞的。
     
     
    FILE * popen ( const char * command , const char * type );
      type 参数只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 "r" 则文件指针连接到 command 的标准输出;如果 type 是 "w" 则文件指针连接到 command 的标准输入。
      注意:popen的第二个参数会将标准输出或者标准输入的数据流传入FILE*的流中。也就是这个时候调用fread只会读取command的数据。
     
    eg:
    #include <stdio.h>
    #include <unistd.h>
    
    int main(void)
    {
            FILE *fp = NULL;
            char array[1024] = {'\0'};
    
            fp = popen("ifconfig -a", "r");
            printf("1111111111111111111111111111111111\n");
            fread(array, 1, 1024, fp);
    
            printf("------------------------------\n");
            printf("%s",array);
            fclose(fp);
    
            return 0;
    
    }

    结果:

    1111111111111111111111111111111111

    ------------------------------ enp2s0: ... lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 .....

      所以不用担心fread会读取popen中command输出数据以外的数据。

     
     
    最近写的程序,要求进程在调用的外部命令运行完毕之后,再继续 向下进行。
    一开始调用的popen,然后只是用了fgetc,使其阻塞,但是总是阻塞不了。原因就是如果外部命令有很多的输出内容,那fgets在得到输出的第一个字符的时候就返回了,不在阻塞了;调用fread,如果size和nitems设置的不够大,也是一样的问题。比如外部命令要输出100个字符,结果size是sizeof(char),nitems是10,那么当fread读到地10个字符的时候,就已经满足条件了,就返回了。
    正确的方法是调用system,因为system最后会调用waitpid,来等待子进程运行完毕。
  • 相关阅读:
    第十六节:类与对象基本概念
    dedecms源码分析:(1)index.php
    第十二节:控制结构foreachbreakcontinueswitch
    PHP的输出缓冲区(转)
    C 结构体小结
    指针参数在内存中的传递
    C typedef用途小结
    C语言考试2 题目整理
    MinGW 环境下 给hello.exe 自定义一个图标
    JavaEE程序设计快速入门小结
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/16141267.html
Copyright © 2020-2023  润新知