《popen和system的區別》


popen和system都可以執行外部命令。
popen相當於是先創建一個管道,fork,關閉管道的一端,執行exec,返回一個標准的io文件指針。
system相當於是先后調用了fork, exec,wait來執行外部命令
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,來等待子進程運行完畢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM