【问题标题】:Return exec output from program via parameter reference通过参数引用从程序返回 exec 输出
【发布时间】:2016-04-06 08:52:29
【问题描述】:

我正在尝试从 C 程序中执行 shell 命令。

为此,我构建了一个包装函数,它将返回命令本身的退出代码,并使用参数引用变量返回程序的实际输出。

exec 函数包装器如下所示:

int _exec(const void *command, char **result) {
    FILE *fp;
    char path[1035];
    char *eof;

    /* Open the command for reading. */
    fp = popen(command, "r");
    if (fp == NULL) {
        return -1;
    }

    while((eof = fgets(path, sizeof(path), fp)) != NULL);

    /* Fill the parameter reference */
    *result = strdup(path);

    /* close */
    pclose(fp);
    return 0;
}

调用部分如下所示:

int result = 0;
char *tmp;

result =_exec("ls /", &tmp);
printf("%s", tmp);

可惜在调用部分,当我printftmp时,只包含命令输出的最后一行。

知道我做错了什么吗?我怎样才能得到所有行 int *result 并因此进入tmp

【问题讨论】:

    标签: c string char


    【解决方案1】:

    使用fread 代替fgetsfgets 停止读取每个换行符,但您将所有行保存在 path 缓冲区的第一个位置。此外,您需要跟踪path 中已经存在的字节数,并在每次调用读取函数时将数据保存到path 中第一个未使用的位置。

    【讨论】:

    • 当我尝试 fread 它根本不起作用:fread(*result, 1, sizeof(char*), fp);
    • 阅读fread 文档以了解作为参数传递的内容。第一个是path,和以前一样。在count 中传递缓冲区的大小,sizeof(path);它不会读到行尾。实际上你不需要 while 循环,就好像它没有读取所有数据一样,你的缓冲区无论如何都会满的。
    • 我怎么知道我必须在读取之前声明路径的数组大小?
    • 你没有。设置一个您期望能够容纳程序的所有输出文本的大小。否则你将不得不处理动态内存,每次你看到你需要更多时分配它。
    • 您也可以将文件描述符的关闭留到以后,并在程序的调用部分使用“fprintf”而不是“printf”,以便它直接打印执行命令的输出(以文件描述符作为参数)。文件描述符可以稍后关闭。
    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2023-03-09
    • 2019-09-08
    相关资源
    最近更新 更多