#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
// 臨時數組長度
#define STRLEN 1024
// cmd返回行數
#define CMD_LINE 1000
int vs_system(const char *cmd, char ***resvec)
{
FILE *fp = NULL;
int i;
char data[STRLEN] = {'0'};
fp = popen(cmd, "r");
if (fp == NULL) {
fprintf(stderr, "popen error:%s\n", strerror(errno));
return 1;
}
*resvec = (char **)malloc(sizeof(char *)*CMD_LINE);
if (!*resvec) {
fprintf(stderr, "malloc error");
pclose(fp);
return -1;
}
int cmd_size = 0;
while (fgets(data, sizeof(data), fp) != NULL) {
int len = strlen(data) - 1;
if (data[len] == '\n')
data[len] = '\0'; //去除換行符
(*resvec)[cmd_size] = strdup(data);
if (!(*resvec)[cmd_size]) {
fprintf(stderr, "strdup error\n");
goto ERROR;
}
cmd_size++;
}
pclose(fp);
return cmd_size;
ERROR:
pclose(fp);
for (i = 0; i < cmd_size; i++)
free((*resvec)[i]);
free(*resvec);
return -1;
}
int main()
{
char **resvec = NULL;
int cmd_size = vs_system("ls -la", &resvec);
int i;
for (i = 0; i < cmd_size - 1; i++)
printf("%s\n", resvec[i]);
// 釋放內存
for (i = 0; i < cmd_size; i++) {
if (resvec[i])
free(resvec[i]);
}
if(resvec)
free(resvec);
return 0;
}
編譯
valgrind --leak-check=full -v ./vs_system