1、system 的正确使用
由于程序中我们可以通过 system() 调用标准的 shell 命令(成功返回 0)可以减少很多繁琐的细节。
bool root_exec_cmd(char * cmd_buf)
{
int status;
bool exec_switch = false;
int32_t oldUid = getuid();
if(setuid(0) != 0) // 获取 root 权限
{
LOGE("get root permision fail [%s]",strerror(errno));
return false;
}
status = system(cmd_buf); // 创建子进程等准备工作。如果失败,返回-1。
if(-1 == status)
{
LOGD("exec cmd [ %s ] create child process fail [%s]",cmd_buf,strerror(errno));
exec_switch = false;
}else {
if (WIFEXITED(status)) // 调用/bin/sh拉起shell脚本,如果拉起失败或者shell未正常执行结束,如果WIFEXITED(status)为真,则说明正常结束。
{
if (0 == WEXITSTATUS(status)) // 这里判断 执行的 cmd 的返回值
{
LOGD("shell cmd [%s] exec success",cmd_buf);
exec_switch = true;
}else {
LOGD("run shell cmd [%s] fail, error code: %d, error info [%s] ", cmd_buf , WEXITSTATUS(status), strerror(WEXITSTATUS(status)));
exec_switch = false;
}
}else {
LOGD("[%s] child process abnormal exit ", cmd_buf);
if(WIFSIGNALED(status))
{
LOGD("abnormal exit signal: %d ", WTERMSIG(status));
}else if(WIFSTOPPED(status))
{
LOGD("stop exec signal : %d ",WSTOPSIG(status));
}else {
LOGD("unknow signal ...");
}
exec_switch = false;
}
}
if(exec_switch == true)
{
if(setuid(oldUid) != 0)
{
LOGE("restore hostUpdate permision fail [%s]",strerror(errno));
return false;
}
return true;
}else {
if(setuid(oldUid) != 0)
{
LOGE("restore hostUpdate permision fail [%s]",strerror(errno));
return false;
}
return false;
}
}