Linux中的popen函式和system函式

2021-08-20 02:24:26 字數 2236 閱讀 4941

說在前面:在實際程式設計中儘量減少使用system函式。

int system(const char *command);

說明:system()通過呼叫/ bin / sh -c命令執行命令中指定的命令,並在命令完成後返回。在執行該命令期間,sigchld將被阻塞,並且sigint和sigquit將被忽略。

返回值:

實際上system呼叫了三個函式:fork()、exec()、waitpid()。因此有三種返回值:

1>fork()失敗或者waitpid()返回除了eintr之外的出錯,則system返回-1.而且errno

中設定了錯誤型別值。

2>如果exec失敗(表示不能執行shell),則其返回值如同shell執行了exit(127)一樣

3>如果三個函式都執行成功,並且system的返回值是shell的終止狀態,其格式已在已在waitpid中說明。

system的實現:

int system(const char * cmdstring)  

if((pid = fork())<0)

else if(pid = 0)

else

} }

return status;

}

簡單的使用:

#include #include #include #include int main()

if(wifexited(status) != 0) //正常退出

else

} else //異常退出

return 0;

}

通過上面的**我們可以看到,system在使用時的乙個弊端,由於返回值太多,要安全的使用它就要進行許多步的出錯處理。

所以,不太建議使用system。

使用system需要注意:

1、建議system()函式只用來執行shell命令,因為一般來講,system()返回值不是0就說明出錯了; 

2、監控一下system()函式的執行完畢後的errno值,爭取出錯時給出更多有用資訊; 

建議使用popen函式取代system();

file *popen(const char *command, const char *type);

int pclose(file *stream);返回值: command的終止狀態, 出錯返回-1

popen()函式較於system()函式的優勢在於使用簡單,popen()函式只返回兩個值:

成功返回子程序的status,使用wifexited相關巨集就可以取得command的返回結果;

失敗返回-1,我們可以使用perro()函式或strerror()函式得到有用的錯誤資訊。

popen先執行fork,然後呼叫exec以執行command並返回乙個標準i/o檔案指標。如果type是「r」,則檔案指標鏈結到command的標準輸出。如果type是「w」,則檔案指標鏈結到command的標準輸入。將popen和fopen進行模擬,方便記憶其最後乙個引數及其作用,如果type是「r」,則返回檔案指標是刻度的,如果type是是「w」,則是可寫的。

簡單使用:

#include #include int main()

; fp = popen("ls -a", "r");

if(null == fp)

while(fgets(buf, 1024, fp) != null)

pclose(fp);

return 0;

}

注意,popen絕不應該由設定使用者id或設定組id程式呼叫。當它執行命令

popen等同於execl("/bin/sh", "sh", "-c", command

,null);

它在從呼叫者繼承的環境中執行shell,並由shell解釋執行command。乙個心懷不軌的使用者可以

操縱這種環境,使得shell能以設定id檔案模式所授予的提公升了

的許可權以及非預期的方式執行命令。

popen特別適用於構造簡單的過濾程式,它變換執行命令的輸入或輸出。

當命令希望構建自己的管道線時就是這種情形。

Linux中的system和popen的效率比較

在本次專案中有比較多的直接調命令的地方,所以就在想用system函式還是popen函式,哪個效率更高呢。在網上找了找,看見說什麼的都有,而且感覺他們的測試方法也有點不太贊同,所以就自己寫了個測試 看看到底哪個效率更高點。關於system函式和popen函式的基本知識在這就不再提了,只發表一下自己的測...

linux的popen函式使用

有了popen,使得linux開發的程式相當於可以輕鬆呼叫這台機器上的任何程式,因為popen執行命令後,可以返回執行輸出結果供程式使用 使用範例 include include strlen include include includeusing namespace std execute sh...

system函式和popen函式

include file popen const char command,const char type int pclose file stream popen總是和pclose一起出現被使用的。popen 建立乙個管道,通過fork或者invoke乙個子程序,然後執行command。返回值在標...