system的原理其實就是調用fork創建子進程去執行shell命令,然後返回最後一條shell命令的狀態值。linux下man system可以看到返回值說明:
1.如果返回值等於-1就是system函數執行失敗,準確的說是fork創建子進程失敗。
2.shell執行最後一條語句的狀態值放在返回值的低8位,使用WEXITSTATUS宏可以獲得狀態值。
3.使用WIFEXITED宏取返回值判斷是否執行成功,如果返回真就成功。
綜上,可以看出來,首先我們要判斷system返回值不等於-1那麼fork成功了,然後判斷WIFEXITED爲真那麼調用shell成功,最後判斷WEXITSTATUS獲得shell執行狀態值是否爲0就是成功。
int sh_shell(const char *command)
{
int ret = system(command);
if (-1 == ret)
{
printf("sh_shell fork fail");
return -1;
}
else
{
printf("sh_shell exit ret = 0x%x", ret);
if (WIFEXITED(ret))
{
if (0 == WEXITSTATUS(ret))
{
printf("sh_shell success");
return 0;
}
else
{
printf("sh_shell fail, shell status: %d", WEXITSTATUS(ret));
return -1;
}
}
else
{
printf("sh_shell exit status = %d", WEXITSTATUS(ret));
return -1;
}
}
}
在腳本中你想返回自定義值,也是可以通過return或者exit返回給程序,程序通過system返回值獲得。