這幾天調程序(嵌入式Linux),發現程序有時就莫名其妙的死掉,每次都定位在程序中不同的system()函數,直接在shell下輸入system()函數中調用的命令也都一切正常.就沒理這個bug,以為是其他的代碼影響到這個,或是內核驅動文件系統什麼的異常導致,昨天有出現了這個問題,就隨手百了一下度,問題出現了,很多人都說system()函數要慎用要少用要能不用則不用,system()函數不穩定?
下面對system函數做一個簡單的介紹:
頭文件
#i nclude
定義函數
int system(const char * string);
函數說明
system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令,此命>令執行完後隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。 返回值 =-1:出現錯誤 =0:調用成功但是沒有出現子進程 >0:成功退出的子進程的id 如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值>。如果system()調用成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能為 system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。
附加說明
在編寫具有SUID/SGID權限的程序時請勿使用system(),system()會繼承環境變量,通過環境變量可能會造成系統安全的問題。 system函數已經被收錄在標准c庫中,可以直接調用,使用system()函數調用系統命令的基本使用方法如下:
#include
int main()
{
system("mkdir $HOME/.SmartPlatform/");
system("mkdir $HOME/.SmartPlatform/Files/");
system("cp mainnew.cpp $HOME/.SmartPlatform/Files/");
return 0;
}
下面我們來看看system函數的源碼:
#include
#include
#include
#include
int system(const char * cmdstring)
{
pid_t pid;
int status;
if(cmdstring == NULL)
{
return (1);
}
if((pid = fork())<0)
{
status = -1;
}
else if(pid = 0)
{
execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); -exit(127); //子進程正常執行則不會執行此語句 }
else
{
while(waitpid(pid, &status, 0) < 0)
{
if(errno != EINTER){ status = -1; break;
}
}
}
return status;
}
花了兩天時間仔細研究了一下,在網上發現了一篇精品博客,介紹的很詳細了,謝謝博主,直接轉, 原文如下: http://www.linuxidc.com/Linux/2013-09/90151p2.htm