//安全执行shell命令函数
//如果不需要shell命令返回结果,pResult赋值为NULL
int sSystem(const char *pCmd, char *pResult, int len)
{
const char *command;
char result_buf[1024];
int rc = 0; // 用于接收命令返回值
FILE *fp = NULL;
if(pCmd == NULL)
{
pr_debug("%s[%d]:The input command is null !\n", __FILE__, __LINE__);
return -1;
}
command = pCmd;
memset(result_buf, 0, sizeof(result_buf));
pr_debug("%s[%d]:开始执行命令:%s\n", __FILE__, __LINE__, command);
/*执行预先设定的命令,并读出该命令的标准输出*/
fp = popen(command, "r");
if(fp == NULL)
{
pr_debug("%s[%d]:popen执行失败(%s)\n", __FILE__, __LINE__, strerror(errno));
return -1;
}
//逐行取出shell命令输出结果,防止数据丢失
while(fgets(result_buf, (sizeof(result_buf) - 1), fp) != NULL)
{
len = len - strlen(result_buf);
if((pResult != NULL) && (len > 0))
{
strcat(pResult, result_buf);
}
pr_debug("%s[%d]:%s", __FILE__, __LINE__, result_buf);
}
/*等待命令执行完毕并关闭管道及文件指针*/
rc = pclose(fp);
if(rc == -1) {
pr_debug("%s[%d]:关闭文件指针失败!\n", __FILE__, __LINE__);
return -1;
}else {
pr_debug("%s[%d]:子进程结束状态【%d】命令返回值【%d】\r\n", __FILE__, __LINE__, rc, WEXITSTATUS(rc));
}
return 0;
}
//如果不需要shell命令返回结果,pResult赋值为NULL
int sSystem(const char *pCmd, char *pResult, int len)
{
const char *command;
char result_buf[1024];
int rc = 0; // 用于接收命令返回值
FILE *fp = NULL;
if(pCmd == NULL)
{
pr_debug("%s[%d]:The input command is null !\n", __FILE__, __LINE__);
return -1;
}
command = pCmd;
memset(result_buf, 0, sizeof(result_buf));
pr_debug("%s[%d]:开始执行命令:%s\n", __FILE__, __LINE__, command);
/*执行预先设定的命令,并读出该命令的标准输出*/
fp = popen(command, "r");
if(fp == NULL)
{
pr_debug("%s[%d]:popen执行失败(%s)\n", __FILE__, __LINE__, strerror(errno));
return -1;
}
//逐行取出shell命令输出结果,防止数据丢失
while(fgets(result_buf, (sizeof(result_buf) - 1), fp) != NULL)
{
len = len - strlen(result_buf);
if((pResult != NULL) && (len > 0))
{
strcat(pResult, result_buf);
}
pr_debug("%s[%d]:%s", __FILE__, __LINE__, result_buf);
}
/*等待命令执行完毕并关闭管道及文件指针*/
rc = pclose(fp);
if(rc == -1) {
pr_debug("%s[%d]:关闭文件指针失败!\n", __FILE__, __LINE__);
return -1;
}else {
pr_debug("%s[%d]:子进程结束状态【%d】命令返回值【%d】\r\n", __FILE__, __LINE__, rc, WEXITSTATUS(rc));
}
return 0;
}