說在前面:在實際程式設計中儘量減少使用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。返回值在標...