linux system函數(shù)
system()函數(shù)是Linux下的一個函數(shù),那么它具體作用是干什么呢?下面由學(xué)習(xí)啦小編為大家整理了linux system()函數(shù)的相關(guān)知識,希望對大家有幫助!
一,linux system()函數(shù)理解
功能:system()函數(shù)調(diào)用“/bin/sh -c command”執(zhí)行特定的命令,阻塞當(dāng)前進(jìn)程直到command命令執(zhí)行完畢
原型:
int system(const char *command);
返回值:
如果無法啟動shell運行命令,system將返回127;出現(xiàn)不能執(zhí)行system調(diào)用的其他錯誤時返回-1。如果system能夠順利執(zhí)行,返回那個命令的退出碼。
說明:
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í)行時,會調(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í)行則不會執(zhí)行此語句
}
else{
while(waitpid(pid, &status, 0) < 0){
if(errno != EINTER){
status = -1;
break;
}
}
}
return status;
}
三,linux system()函數(shù)說明
system()會調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來調(diào)用/bin/sh-c string來執(zhí)行參數(shù)string字符串所代表的命令,此命>令執(zhí)行完后隨即返回原調(diào)用的進(jìn)程。
在調(diào)用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值
=-1:出現(xiàn)錯誤
=0:調(diào)用成功但是沒有出現(xiàn)子進(jìn)程
>0:成功退出的子進(jìn)程的id
如果system()在調(diào)用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數(shù)string為空指針(NULL),則返回非零值>。如果system()調(diào)用成功則最后會返回
執(zhí)行shell命令后的返回值,但是此返回值也有可能為 system()調(diào)用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認(rèn)執(zhí)行成功。
附加說明
在編寫具有SUID/SGID權(quán)限的程序時請勿使用system(),system()會繼承環(huán)境變量,通過環(huán)境變量可能會造成系統(tǒng)安全的問題。
system函數(shù)對返回值的處理,涉及3個階段:
階段1:創(chuàng)建子進(jìn)程等準(zhǔn)備工作。如果失敗,返回-1。
階段2:調(diào)用/bin/sh拉起shell腳本,如果拉起失敗或者shell未正常執(zhí)行結(jié)束(參見備注1),原因值被寫入到status的低8~15比特位中。system的man中只說明了會寫了127這個值,但實測發(fā)現(xiàn)還會寫126等值。
階段3:如果shell腳本正常執(zhí)行結(jié)束,將shell返回值填到status的低8~15比特位中。