gpt4 book ai didi

c - 如何从C中的STDOUT读取直到EOF?

转载 作者:行者123 更新时间:2023-12-04 09:33:25 24 4
gpt4 key购买 nike

#1:给定命令,我不知道 stdout 产生的输出大小。
#2:我不想像这样使用字符数组

char buffer[1024];
因为它会导致内存不足或浪费。
#3:如果我使用字符指针
char *buffer;
我将不得不为它分配内存
buffer = (char *)malloc(1024 * sizeof(char));
#4: 如果我在 while 循环中使用 getc() 就像
char *buf, c;
int i=0, j=1;
int pipefd[2];
int stdout_bk;
code[message_read] = '\0';
stdout_bk = dup(fileno(stdout));
pipe(pipefd);
dup2(pipefd[1], STDOUT_FILENO);

system(code);
close(pipefd[1]);

dup2(stdout_bk, STDOUT_FILENO);
buf = (char*)malloc(sizeof(char));

while(c!=End_Of_File) // What should I replace End_Of_File with?
{
c = getc(pipefd[0]);
buf = (char*)realloc(buf, j * sizeof(char));
buf[i] = c;
i++;
j++;
}
我不知道标准输出数据的 End_Of_file 是什么。
P.S.:程序运行一个命令,例如 system("setarch x86_64 -R dd if=/proc/self/maps | grep bin/dd") 或 system("ls -al") 并且我需要获取 STDOUT。为此,我使用了 dup2 并需要将输出通过管道传输到缓冲区。
注意:输出可以是可变长度的。

最佳答案

您的代码有很多问题:

  • c必须用类型 int 定义
  • getc()不能将系统句柄作为参数,您必须将其包装在 FILE* 中与 fdopen() .
  • End_Of_File用于 getc() 返回的数据就是 EOFc必须有类型 int为了文件结束测试是可靠的。
  • 一次重新分配一个字节的数组效率低下,并且可能比按块重新分配更浪费
  • 更重要的是,如果您打算将此缓冲区用作 C 字符串,您可能需要为空终止符分配一个额外的字节。
  • system() 的输出命令将被限制为系统管道缓冲区的大小,通常约为 5KB,因此您的程序将因任何更大的输出而卡住。
  • 使用起来要简单得多 popen()为了你的目的。

  • 这是一个简化版本:
    #include <stdio.h>
    #include <stdlib.h>

    int main() {
    char code[] = "ls -lR";
    char *buf = NULL;
    int c;
    int i = 0;
    FILE *fp;

    fp = popen(code, "r");
    if (fp == NULL) {
    fprintf(stderr, "popen error\n");
    return 1;
    }
    while ((c = getc(fp)) != EOF) {
    buf = (char *)realloc(buf, i + 2);
    if (buf == NULL) {
    fprintf(stderr, "out of memory\n");
    pclose(fp);
    return 1;
    }
    buf[i++] = (char)c;
    }
    pclose(fp);
    printf("output: %d bytes\n", i);
    if (buf != NULL) {
    buf[i] = '\0';
    fputs(buf, stdout);
    }
    free(buf);
    return 0;
    }

    关于c - 如何从C中的STDOUT读取直到EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62715932/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com