使用popen
test.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmd_run(char *cmd, char* results, int len)
{
FILE *fp;
char *buf;
int totolen = 0;
printf("run_cmd: [%s]\n", cmd);
if ((fp = popen(cmd, "r")) == NULL) {
printf("NMPPROTDATA_LOG: Fail to popen %s\n", cmd);
return -1;
}
buf = (char *)calloc(1, len);
if (buf == NULL)
{
pclose(fp);
printf("NMPPROTDATA_LOG: Fail to alloc buffer %d\n", len);
return -1;
}
while (fgets(buf, (len - totolen), fp) != NULL) {
strcpy(results + totolen, buf);
totolen += strlen(buf);
if(len == (totolen + 1)) {
//read enough string
break;
}
memset(buf, 0, len);
}
pclose(fp);
free(buf);
//printf("results: [%s]\n", results);
return 0;
}
int main(void) {
int ret_val = -1;
char buf[20] = {0};
char cmd[512] = {0};
printf("start\n");
sprintf(cmd, "pwd");
ret_val = cmd_run(cmd, buf, sizeof(buf));
if(ret_val < 0) {
printf("execute fail\n");
} else {
printf("result:%s\n", buf);
}
}
不用malloc方式,避免用内存检测工具误报
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmd_run(char *cmd, char* results, int len)
{
FILE *fp;
char buf[len];
int totolen = 0;
printf("run_cmd: [%s]\n", cmd);
if ((fp = popen(cmd, "r")) == NULL) {
printf("NMPPROTDATA_LOG: Fail to popen %s\n", cmd);
return -1;
}
memset(buf, 0, len);
while (fgets(buf, (len - totolen), fp) != NULL) {
strcpy(results + totolen, buf);
totolen += strlen(buf);
if(len == (totolen + 1)) {
//read enough string
break;
}
memset(buf, 0, len);
}
pclose(fp);
//printf("results: [%s]\n", results);
return 0;
}
int main(void) {
int ret_val = -1;
char buf[3] = {0};
char cmd[512] = {0};
printf("start\n");
sprintf(cmd, "ls");
ret_val = cmd_run(cmd, buf, sizeof(buf));
if(ret_val < 0) {
printf("execute fail\n");
} else {
printf("result:%s\n", buf);
}
}