int xsystem(const char *cmd)
{
int err;
err = system(cmd);
if (err == -1) {
fprintf(stderr, "%s: ERROR: fork failed before execution: `%s'
",
__FUNCTION__, cmd);
return -1;
}
if (WIFSIGNALED(err)) {
fprintf(stderr, "%s: ERROR: Child process died due to signal %d: `%s'
",
__FUNCTION__, WTERMSIG(err), cmd);
return -1;
}
if (WIFEXITED(err)) {
/* Normal child exit */
return WEXITSTATUS(err);
}
fprintf(stderr, "%s: ERROR: Received unintelligible return value from system: %d",
__FUNCTION__, err);
return -1;
}
子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:
WIFEXITED(status)如果若为正常结束子进程返回的状态,则为真;对于这种情况可执行WEXITSTATUS(status),取子进程传给exit或_eixt的低8位。
WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)若为异常结束子进程返回的状态,则为真;对于这种情况可执行WTERMSIG(status),取使子进程结束的信号编号。
nRet = system(sCommand);
//WIFEXITED(stat)' 如果子进程正常退出则返回非;`WEXITSTATUS(stat)' 子进程返回的退出码 if (!((ZX_SYS_NO_ERROR != WIFEXITED(nRet)) && (ZX_SYS_NO_ERROR == WEXITSTATUS(nRet))))
{ return -1;
}
测试的返回值为:
WIFEXITED(nRet)[[[1]]]
WEXITSTATUS(nRet)[[[0]]] rolesrv -k 这个命令执行成功的返回值为:0
///////////////////////////////////////////////////////////////////////////////
system返回值描述
-1 创建失败或者程序的退出状态无法获得,也就是fork或者waitpid失败 -----这个可能资源问题或者系统限制导致创建子进程失败。 127 执行程序失败,也就是exec失败------------------------------------执行脚本存在问题,例如程序无权限或者不存在。
当前专家建议:
请检查主机资源是否足够或者线程数超过系统设置最大阀值:
修改后:
返回为-1,请参考返回的系统错误码和错误信息,检查主机设置最大进程数和系统资源是否不足。
返回为127,请检查执行脚本是否存在问题,例如没有权限或者执行程序不存在等
//WIFEXITED(stat)' 如果子进程正常退出则返回非;`WEXITSTATUS(stat)' 子进程返回的退出码 if (!((ZX_SYS_NO_ERROR != WIFEXITED(nRet)) && (ZX_SYS_NO_ERROR == WEXITSTATUS(nRet))))
{ return -1;
}
测试的返回值为:
WIFEXITED(nRet)[[[1]]]
WEXITSTATUS(nRet)[[[0]]] rolesrv -k 这个命令执行成功的返回值为:0
///////////////////////////////////////////////////////////////////////////////
system返回值描述
-1 创建失败或者程序的退出状态无法获得,也就是fork或者waitpid失败 -----这个可能资源问题或者系统限制导致创建子进程失败。 127 执行程序失败,也就是exec失败------------------------------------执行脚本存在问题,例如程序无权限或者不存在。
当前专家建议:
请检查主机资源是否足够或者线程数超过系统设置最大阀值:
修改后:
返回为-1,请参考返回的系统错误码和错误信息,检查主机设置最大进程数和系统资源是否不足。
返回为127,请检查执行脚本是否存在问题,例如没有权限或者执行程序不存在等