曾經的曾經,被system()函式折磨過,之所以這樣,是因為對system()函式了解不夠深入。這裡必須要搞懂system()函式,因為有時你不得不面對它。
先來看一下system()函式的簡單介紹:
#includesystem()函式呼叫/bin/sh來執行引數指定的命令,/bin/sh 一般是乙個軟連線,指向某個具體的shell,比如bash,-c選項是告訴shell從字串command中讀取命令; 在該command執行期間,sigchld是被阻塞的,好比在說:hi,核心,這會不要給我送sigchld訊號,等我忙完再說; 在該command執行期間,sigint和sigquit是被忽略的,意思是程序收到這兩個訊號後沒有任何動作。int system(const char *command)
再來看一下system()函式返回值:
為了更好的理解system()函式返回值,需要了解其執行過程,實際上system()函式執行了三步操作:
fork乙個子程序;
在子程序中呼叫exec函式去執行command;
在父程序中呼叫wait去等待子程序結束。 對於fork失敗,system()函式返回-1。 如果exec執行成功,也即command順利執行完畢,則返回command通過exit或return返回的值。 (注意,command順利執行不代表執行成功,比如command:"rm debuglog.txt",不管檔案存不存在該command都順利執行了) 如果exec執行失敗,也即command沒有順利執行,比如被訊號中斷,或者command命令根本不存在,system()函式返回127. 如果command為null,則system()函式返回非0值,一般為1.
看一下system()函式的原始碼
看完這些,我想肯定有人對system()函式返回值還是不清楚,看原始碼最清楚,下面給出乙個system()函式的實現:
int system(const char * cmdstring)仔細看完這個system()函式的簡單實現,那麼該函式的返回值就清晰了吧,那麼什麼時候system()函式返回0呢?只在command命令返回0時。if((pid = fork())<0)
else if(pid == 0)
else //父程序}}
return status; //如果waitpid成功,則返回子程序的返回狀態
}
看一下該怎麼監控system()函式執行狀態 這裡給我出的做法:
int status;system()函式用起來很容易出錯,返回值太多,而且返回值很容易跟command的返回值混淆。這裡推薦使用popen()函式替代,關於popen()函式的簡單使用可以自己查下資料。if(null == cmdstring) //如果cmdstring為空趁早閃退吧,儘管system()函式也能處理空指標
status = system(cmdstring);
if(status < 0)
if(wifexited(status))
else if(wifsignaled(status))
else if(wifstopped(status))
popen()函式較於system()函式的優勢在於使用簡單,popen()函式只返回兩個值: 成功返回子程序的status,使用wifexited相關巨集就可以取得command的返回結果; 失敗返回-1,我們可以使用perro()函式或strerror()函式得到有用的錯誤資訊。
這篇文章只涉及了system()函式的簡單使用,還沒有談及sigchld、sigint和sigquit對system()函式的影響,事實上,之所以今天寫這篇文章,是因為專案中因有人使用了system()函式而造成了很嚴重的事故。現像是system()函式執行時會產生乙個錯誤:「no child processes」。此時呼叫my_system()來執行system函式的功能(my_system函式中是使用popen()函式來實現的), 測試了一天,沒有再次出現程式突然死掉的問題(修改前連續迴圈呼叫system()函式測試,每10次就會至少導致程式掛掉一次.連續不停頓的呼叫)。
免費提供最新linux技術教程書籍,為開源技術愛好者努力做得更多更好:
linux 下的system函式
linux作業系統下system 函式詳解 執行shell 命令 相關函式 fork,execve,waitpid,popen 表頭檔案 i nclude 定義函式 int system const char string 函式說明 system 會呼叫fork 產生子程序,由子程序來呼叫 bin ...
linux下system和execl函式的區別
今天學到了execl函式族,發現函式功能就是呼叫系統的二進位制程式或者一些指令碼檔案,此函式族函式一大堆,可是仔細想想實現的功能和前面的system函式沒什麼區別,感覺system函式方便多了,為何還要exec弄一大堆呢?肯定是有原因的啦!小結兩點區別關係 1.system會新起乙個子程序來呼叫要執...
關於System表空間
每個oracle資料庫都包含乙個名為 system 的表空間 tablespace 她在資料庫建立時由 oracle自動建立。只要資料庫處於開啟 open 狀態,system 表空間就一定是聯機 online 的。管理員可以建立本地管理的 locally managed system 表空間 tab...