我想:

  • redirect stdout/stderr
  • 到内存缓冲区,而不是磁盘
  • ,同时使stdout/err像正常
  • 一样运行

    我知道如何使用dup2和freopen来:
  • 将stdout/err重定向到我选择的
  • 文件
  • ,同时使stdout/err像正常
  • 一样运行

    ...但是我不确定第2项吗?

    原因:我想对发送到stdout/err(来自第三方代码)的数据进行后处理,然后将其发送到Web服务器-同时使应用程序正常运行。

    为什么? ...因为现在当我们的应用程序运行时,我们看到关键数据从第三方代码进入stdout(和err),并且它是一种PITA,可让用户尝试使用本地日志文件。我宁愿将“最后N个字节”捕获到环形缓冲区中,对其进行后处理,然后-如果用户报告存在问题,则将其发送到服务器。

    为什么要避免文件? ...因为这是针对必须同时在iOS和台式机上运行的代码,而“不断写入文件”是我要避免的事情,因为我始终不希望将其作为文件。另外...我将不得不担心该文件的维护,主动调整其大小等。

    最佳答案

    Stdout是一个基本的文件句柄,这意味着它是一个指针。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv);
    
    int main (argc,argv)
    int argc;
    char **argv;
    {
        stdout = &(*stderr);
        fprintf(stdout, "test");
        return 0;
    }
    

    通过声明stdout指向不同的文件句柄,该程序将重定向stdout。要对其进行测试,请将其编译为test,然后在命令行上键入./test > t./test 2> t

    重定向的stdout管道仍将输出单词test,而重定向的stderr管道则不会。

    由于文件是流,因此请阅读section of the GNU C Library以了解如何创建内存流。本示例创建一个文本缓冲区以动态调整大小以容纳输入,并重定向stdout指向它。
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv);
    
    int main (argc,argv)
    int argc;
    char **argv;
    {
        char *bp;
        size_t size;
        FILE *stream;
    
        stream = open_memstream (&bp, &size);
        stdout = &(*stream);
        fprintf(stdout, "test");
        fflush(stdout);
        fprintf(stderr, "buf = %s, size = %d\n", bp, size);
        fclose (stream);
        free(bp);
        return 0;
    }
    

    在手册中的输入和输出之间切换时,请特别注意冲洗缓冲区的部分。

    关于c - 将文件发送到内存缓冲区(打开某些内容,但写入缓冲区而不是磁盘),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9591196/

    10-11 22:50
    查看更多