主頁(yè) > 知識(shí)庫(kù) > Linux中popen函數(shù)的作用小結(jié)

Linux中popen函數(shù)的作用小結(jié)

熱門(mén)標(biāo)簽:電銷(xiāo)機(jī)器人加盟多少錢(qián) 貴陽(yáng)400電話(huà)到哪里去辦理 汨羅代理外呼系統(tǒng) 宿松高德地圖標(biāo)注 400電話(huà)申請(qǐng)找 申請(qǐng)400電話(huà)有什么用 天津智能外呼系統(tǒng)排名 網(wǎng)絡(luò)電話(huà)外呼系統(tǒng)撥號(hào)軟件 4層電梯外呼控制系統(tǒng)設(shè)計(jì)

簡(jiǎn)單說(shuō)一下popen()函數(shù)

函數(shù)定義

#include stdio.h>
FILE * popen(const char *command , const char *type );
int pclose(FILE *stream);

函數(shù)說(shuō)明

  popen()函數(shù)通過(guò)創(chuàng)建一個(gè)管道,調(diào)用fork()產(chǎn)生一個(gè)子進(jìn)程,執(zhí)行一個(gè)shell以運(yùn)行命令來(lái)開(kāi)啟一個(gè)進(jìn)程。這個(gè)管道必須由pclose()函數(shù)關(guān)閉,而不是fclose()函數(shù)。pclose()函數(shù)關(guān)閉標(biāo)準(zhǔn)I/O流,等待命令執(zhí)行結(jié)束,然后返回shell的終止?fàn)顟B(tài)。如果shell不能被執(zhí)行,則pclose()返回的終止?fàn)顟B(tài)與shell已執(zhí)行exit一樣。

  type參數(shù)只能是讀或者寫(xiě)中的一種,得到的返回值(標(biāo)準(zhǔn)I/O流)也具有和type相應(yīng)的只讀或只寫(xiě)類(lèi)型。如果type是"r"則文件指針連接到command的標(biāo)準(zhǔn)輸出;如果type是"w"則文件指針連接到command的標(biāo)準(zhǔn)輸入。

  command參數(shù)是一個(gè)指向以NULL結(jié)束的shell命令字符串的指針。這行命令將被傳到bin/sh并使用-c標(biāo)志,shell將執(zhí)行這個(gè)命令。

  popen()的返回值是個(gè)標(biāo)準(zhǔn)I/O流,必須由pclose來(lái)終止。前面提到這個(gè)流是單向的(只能用于讀或?qū)懀O蜻@個(gè)流寫(xiě)內(nèi)容相當(dāng)于寫(xiě)入該命令的標(biāo)準(zhǔn)輸入,命令的標(biāo)準(zhǔn)輸出和調(diào)用popen()的進(jìn)程相同;與之相反的,從流中讀數(shù)據(jù)相當(dāng)于讀取命令的標(biāo)準(zhǔn)輸出,命令的標(biāo)準(zhǔn)輸入和調(diào)用popen()的進(jìn)程相同。

返回值

  如果調(diào)用fork()或pipe()失敗,或者不能分配內(nèi)存將返回NULL,否則返回標(biāo)準(zhǔn)I/O流。popen()沒(méi)有為內(nèi)存分配失敗設(shè)置errno值。如果調(diào)用fork()或pipe()時(shí)出現(xiàn)錯(cuò)誤,errno被設(shè)為相應(yīng)的錯(cuò)誤類(lèi)型。如果type參數(shù)不合法,errno將返回EINVAL。

函數(shù)原型:

 #include “stdio.h”
  FILE *popen( const char *command, const char* mode )
    int pclose(FILE *stream_to_close);

參數(shù)說(shuō)明:

  command: 是一個(gè)指向以 NULL 結(jié)束的 shell 命令字符串的指針。這行命令將被傳到 bin/sh 并使用 -c 標(biāo)志,shell 將執(zhí)行這個(gè)命令。

  mode: 只能是讀或者寫(xiě)中的一種,得到的返回值(標(biāo)準(zhǔn) I/O 流)也具有和 type 相應(yīng)的只讀或只寫(xiě)類(lèi)型。如果 type 是 “r” 則文件指針連接到 command 的標(biāo)準(zhǔn)輸出;如果 type 是 “w” 則文件指針連接到 command 的標(biāo)準(zhǔn)輸入。

作用:

    popen函數(shù)允許一個(gè)程序?qū)⒘硗庖粋€(gè)程序作為新進(jìn)程來(lái)啟動(dòng),并可以傳遞數(shù)據(jù)或者通過(guò)它接受數(shù)據(jù)。

    其內(nèi)部實(shí)現(xiàn)為調(diào)用 fork 產(chǎn)生一個(gè)子進(jìn)程,執(zhí)行一個(gè) shell, 以運(yùn)行命令來(lái)開(kāi)啟一個(gè)進(jìn)程,這個(gè)進(jìn)程必須由 pclose() 函數(shù)關(guān)閉。

缺點(diǎn):

    使用popen的不好影響是,針對(duì)每個(gè)popen調(diào)用,不僅要啟動(dòng)一個(gè)被請(qǐng)求的程序,還要啟動(dòng)一個(gè)shell,即每個(gè)popen調(diào)用將多啟動(dòng)兩個(gè)進(jìn)程。

 舉例:

#includestdio.h> 
  #includeunistd.h> 
  #includestring.h>   
  int main() 
  { 
    FILE *fp=NULL; 
    FILE *fh=NULL; 
    char buff[128]={0};   
   memset(buff,0,sizeof(buff)); 
   fp=popen("ls -l","r");//將命令ls-l 同過(guò)管道讀到fp 
   fh=fopen("shell.c","w+");// 創(chuàng)建一個(gè)可寫(xiě)的文件 
   fread(buff,1,127,fp);//將fp的數(shù)據(jù)流讀到buff中 
   fwrite(buff,1,127,fh);//將buff的數(shù)據(jù)寫(xiě)入fh指向的文件中   
   pclose(fp); 
   fclose(fh);   
   return 0;   
   } 
~        

 運(yùn)行結(jié)果:

[lol@localhost practice]$ ls
popen popen.c shell.c
[lol@localhost practice]$ cat shell.c
total 12
-rwxrwxr-x. 1 lol lol 5478 May 24 15:39 popen
-rw-rw-r--. 1 lol lol 473 May 24 15:39 popen.c
-rw-rw-r--. 1 lol lol  [lol@localhost practice]$ vim popen.c
[lol@localhost practice]$ 

總結(jié)

以上所述是小編給大家介紹的Linux中popen函數(shù)的作用小結(jié),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • 詳解Linux驅(qū)動(dòng)中,probe函數(shù)何時(shí)被調(diào)用

標(biāo)簽:贛州 昌都 臨沂 廣東 撫州 烏蘭察布 海北 連云港

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux中popen函數(shù)的作用小結(jié)》,本文關(guān)鍵詞  Linux,中,popen,函數(shù),的,作用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux中popen函數(shù)的作用小結(jié)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Linux中popen函數(shù)的作用小結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章