使用popen替代system的原因:
1、 system返回值複雜,子執行緒相關返回值會和命令處理返回值重合。(如果失敗,需要列印errorno)
2、 system中建立子執行緒處理cmd命令,返回sigchld訊號,系統避免殭屍程序,一般會將sigchld設定為忽略,從而主線程waitpid不到,會造成返回:no such childprogress錯誤。(可以在system前signal:sig_dfl,system後再signal回去避免報錯)
popen能夠避免這個問題,popen中使用靜態childpid陣列儲存子pid,popen返回null或file,由close來從file中獲取子pid,並waitpid**子pid。並且popen執行shell前會先逐個關閉childpid中的fd,故即使不調pclose也不會造成系統異常
另外,**裡的my_system和my_system_wait執行效果好像沒區別,因為my_system調的也是pclose,pclose中waitpid會阻塞。。
system函式和popen函式
include file popen const char command,const char type int pclose file stream popen總是和pclose一起出現被使用的。popen 建立乙個管道,通過fork或者invoke乙個子程序,然後執行command。返回值在標...
system函式和popen函式
linux的system函式的實現原始碼 system 會呼叫fork 產生子程序,由子程序來呼叫 bin sh c cmdstring來執行引數cmdstring字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。int system const char cmdstring if pid fo...
system與popen函式的效率
我們在程式中希望執行shell命令的時候首先想到的system函式,這個函式很簡單,但有乙個嚴重的問題,就是他的執行方式,效率上可能不高。include include include include include using namespace std timeval start,end dou...