欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂Linux培訓(xùn)分享Linux中popen函數(shù)的作用小結(jié)

2019-07-16 15:08:13 3571瀏覽

喜歡Linux開發(fā)技術(shù)的小伙伴不知道對Linux中popen函數(shù)的作用是否有所了解呢?popen()函數(shù)通過創(chuàng)建一個(gè)管道,調(diào)用fork()產(chǎn)生一個(gè)子進(jìn)程,執(zhí)行一個(gè)shell以運(yùn)行命令來開啟一個(gè)進(jìn)程。本篇文章扣丁學(xué)堂Linux培訓(xùn)小編就給讀者們分享一下Linux中popen函數(shù)的作用,希望對小伙伴們有所幫助。


扣丁學(xué)堂Linux培訓(xùn)分享Linux中popen函數(shù)的作用小結(jié)


簡單說一下popen()函數(shù)


函數(shù)定義


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



函數(shù)說明


popen()函數(shù)通過創(chuàng)建一個(gè)管道,調(diào)用fork()產(chǎn)生一個(gè)子進(jìn)程,執(zhí)行一個(gè)shell以運(yùn)行命令來開啟一個(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ù)只能是讀或者寫中的一種,得到的返回值(標(biāo)準(zhǔn)I/O流)也具有和type相應(yīng)的只讀或只寫類型。如果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來終止。前面提到這個(gè)流是單向的(只能用于讀或?qū)懀?。向這個(gè)流寫內(nèi)容相當(dāng)于寫入該命令的標(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()沒有為內(nèi)存分配失敗設(shè)置errno值。如果調(diào)用fork()或pipe()時(shí)出現(xiàn)錯(cuò)誤,errno被設(shè)為相應(yīng)的錯(cuò)誤類型。如果type參數(shù)不合法,errno將返回EINVAL。



函數(shù)原型:


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



參數(shù)說明:


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


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



作用:


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


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



缺點(diǎn):


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



 舉例:


#include<stdio.h> 
  #include<unistd.h> 
  #include<string.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 同過管道讀到fp 
   fh=fopen("shell.c","w+");// 創(chuàng)建一個(gè)可寫的文件 
   fread(buff,1,127,fp);//將fp的數(shù)據(jù)流讀到buff中 
   fwrite(buff,1,127,fh);//將buff的數(shù)據(jù)寫入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]$ 

想要了解更多關(guān)于Linux開發(fā)方面內(nèi)容的小伙伴,請關(guān)注扣丁學(xué)堂Linux培訓(xùn)官網(wǎng)、微信等平臺,扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育有專業(yè)的Linux講師為您指導(dǎo),此外扣丁學(xué)堂老師精心推出的Linux視頻教程定能讓你快速掌握Linux從入門到精通開發(fā)實(shí)戰(zhàn)技能。扣丁學(xué)堂Linux技術(shù)交流群:422345477。


                          【掃碼進(jìn)入HTML5VIP免費(fèi)公開課】  


     【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】        【掃碼進(jìn)入HTML5前端開發(fā)VIP免費(fèi)公開課】



查看更多關(guān)于“Linux培訓(xùn)資訊”的相關(guān)文章>>

標(biāo)簽: Linux培訓(xùn) Linux視頻教程 紅帽Linux視頻 Linux學(xué)習(xí)視頻 Linux入門視頻 紅帽RHCE/RHCSA考試

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部