linux system函數(shù)
system()函數(shù)是Linux下的一個(gè)函數(shù),那么它具體作用是干什么呢?下面由學(xué)習(xí)啦小編為大家整理了linux system()函數(shù)的相關(guān)知識(shí),希望對(duì)大家有幫助!
一,linux system()函數(shù)理解
功能:system()函數(shù)調(diào)用“/bin/sh -c command”執(zhí)行特定的命令,阻塞當(dāng)前進(jìn)程直到command命令執(zhí)行完畢
原型:
int system(const char *command);
返回值:
如果無(wú)法啟動(dòng)shell運(yùn)行命令,system將返回127;出現(xiàn)不能執(zhí)行system調(diào)用的其他錯(cuò)誤時(shí)返回-1。如果system能夠順利執(zhí)行,返回那個(gè)命令的退出碼。
說(shuō)明:
man幫助:
#include
int system(const char *command);
DESCRIPTION
system() executes a command specified in command by calling /bin/sh -c
command, and returns after the command has been completed. During exe-
cution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT
will be ignored.
RETURN VALUE
The value returned is -1 on error (e.g. fork(2) failed), and the
return status of the command otherwise. This latter return status is
in the format specified in wait(2). Thus, the exit code of the command
will be WEXITSTATUS(status). In case /bin/sh could not be executed,
the exit status will be that of a command that does exit(127).
If the value of command is NULL, system() returns non-zero if the shell
is available, and zero if not.
system() does not affect the wait status of any other children.
二,linux system()函數(shù)原理
system函數(shù)執(zhí)行時(shí),會(huì)調(diào)用fork、execve、waitpid等函數(shù)。
linux版system函數(shù)的源碼:
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); //子進(jìn)程正常執(zhí)行則不會(huì)執(zhí)行此語(yǔ)句
}
else{
while(waitpid(pid, &status, 0) < 0){
if(errno != EINTER){
status = -1;
break;
}
}
}
return status;
}
三,linux system()函數(shù)說(shuō)明
system()會(huì)調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來(lái)調(diào)用/bin/sh-c string來(lái)執(zhí)行參數(shù)string字符串所代表的命令,此命>令執(zhí)行完后隨即返回原調(diào)用的進(jìn)程。
在調(diào)用system()期間SIGCHLD 信號(hào)會(huì)被暫時(shí)擱置,SIGINT和SIGQUIT 信號(hào)則會(huì)被忽略。
返回值
=-1:出現(xiàn)錯(cuò)誤
=0:調(diào)用成功但是沒有出現(xiàn)子進(jìn)程
>0:成功退出的子進(jìn)程的id
如果system()在調(diào)用/bin/sh時(shí)失敗則返回127,其他失敗原因返回-1。若參數(shù)string為空指針(NULL),則返回非零值>。如果system()調(diào)用成功則最后會(huì)返回
執(zhí)行shell命令后的返回值,但是此返回值也有可能為 system()調(diào)用/bin/sh失敗所返回的127,因此最好能再檢查errno 來(lái)確認(rèn)執(zhí)行成功。
附加說(shuō)明
在編寫具有SUID/SGID權(quán)限的程序時(shí)請(qǐng)勿使用system(),system()會(huì)繼承環(huán)境變量,通過(guò)環(huán)境變量可能會(huì)造成系統(tǒng)安全的問(wèn)題。
system函數(shù)對(duì)返回值的處理,涉及3個(gè)階段:
階段1:創(chuàng)建子進(jìn)程等準(zhǔn)備工作。如果失敗,返回-1。
階段2:調(diào)用/bin/sh拉起shell腳本,如果拉起失敗或者shell未正常執(zhí)行結(jié)束(參見備注1),原因值被寫入到status的低8~15比特位中。system的man中只說(shuō)明了會(huì)寫了127這個(gè)值,但實(shí)測(cè)發(fā)現(xiàn)還會(huì)寫126等值。
階段3:如果shell腳本正常執(zhí)行結(jié)束,將shell返回值填到status的低8~15比特位中。