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)建一個管道,調(diào)用fork()產(chǎn)生一個子進程,執(zhí)行一個shell以運行命令來開啟一個進程。這個管道必須由pclose()函數(shù)關(guān)閉,而不是fclose()函數(shù)。pclose()函數(shù)關(guān)閉標準I/O流,等待命令執(zhí)行結(jié)束,然后返回shell的終止狀態(tài)。如果shell不能被執(zhí)行,則pclose()返回的終止狀態(tài)與shell已執(zhí)行exit一樣。
type參數(shù)只能是讀或者寫中的一種,得到的返回值(標準I/O流)也具有和type相應(yīng)的只讀或只寫類型。如果type是"r"則文件指針連接到command的標準輸出;如果type是"w"則文件指針連接到command的標準輸入。
command參數(shù)是一個指向以NULL結(jié)束的shell命令字符串的指針。這行命令將被傳到bin/sh并使用-c標志,shell將執(zhí)行這個命令。
popen()的返回值是個標準I/O流,必須由pclose來終止。前面提到這個流是單向的(只能用于讀或?qū)懀?。向這個流寫內(nèi)容相當于寫入該命令的標準輸入,命令的標準輸出和調(diào)用popen()的進程相同;與之相反的,從流中讀數(shù)據(jù)相當于讀取命令的標準輸出,命令的標準輸入和調(diào)用popen()的進程相同。
返回值
如果調(diào)用fork()或pipe()失敗,或者不能分配內(nèi)存將返回NULL,否則返回標準I/O流。popen()沒有為內(nèi)存分配失敗設(shè)置errno值。如果調(diào)用fork()或pipe()時出現(xiàn)錯誤,errno被設(shè)為相應(yīng)的錯誤類型。如果type參數(shù)不合法,errno將返回EINVAL。
函數(shù)原型:
#include “stdio.h”
FILE *popen( const char *command, const char* mode )
int pclose(FILE *stream_to_close);
參數(shù)說明:
command: 是一個指向以 NULL 結(jié)束的 shell 命令字符串的指針。這行命令將被傳到 bin/sh 并使用 -c 標志,shell 將執(zhí)行這個命令。
mode: 只能是讀或者寫中的一種,得到的返回值(標準 I/O 流)也具有和 type 相應(yīng)的只讀或只寫類型。如果 type 是 “r” 則文件指針連接到 command 的標準輸出;如果 type 是 “w” 則文件指針連接到 command 的標準輸入。
作用:
popen函數(shù)允許一個程序?qū)⒘硗庖粋€程序作為新進程來啟動,并可以傳遞數(shù)據(jù)或者通過它接受數(shù)據(jù)。
其內(nèi)部實現(xiàn)為調(diào)用 fork 產(chǎn)生一個子進程,執(zhí)行一個 shell, 以運行命令來開啟一個進程,這個進程必須由 pclose() 函數(shù)關(guān)閉。
缺點:
使用popen的不好影響是,針對每個popen調(diào)用,不僅要啟動一個被請求的程序,還要啟動一個shell,即每個popen調(diào)用將多啟動兩個進程。
舉例:
#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)建一個可寫的文件
fread(buff,1,127,fp);//將fp的數(shù)據(jù)流讀到buff中
fwrite(buff,1,127,fh);//將buff的數(shù)據(jù)寫入fh指向的文件中
pclose(fp);
fclose(fh);
return 0;
}
~
運行結(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é),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Shell腳本調(diào)試?-n?-v?-x?-c的具體用法
本文主要介紹了Shell腳本調(diào)試?-n?-v?-x?-c的具體用法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
linux shell腳本學(xué)習(xí)xargs命令使用詳解
xargs是一條Unix和類Unix操作系統(tǒng)的常用命令。它的作用是將參數(shù)列表轉(zhuǎn)換成小塊分段傳遞給其他命令,以避免參數(shù)列表過長的問題2013-12-12
Linux定時執(zhí)行任務(wù)at和crontab命令詳解
本篇文章主要介紹了Linux定時執(zhí)行任務(wù)at和crontab命令這兩個命令的基本用法和區(qū)別,一起學(xué)習(xí)下。2017-11-11
一個Linux系統(tǒng)安全設(shè)置的Shell腳本的分享(適用CentOS)
這篇文章主要介紹了一個設(shè)置Linux系統(tǒng)安全的Shell腳本的分享,適用CentOS,包含大部份的安全設(shè)置,只需執(zhí)行腳本就可以得到一個相對安全的Linux系統(tǒng)了,需要的朋友可以參考下2014-06-06

