vs_system: 獲取sh的返回值

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章