【问题标题】:redirect output from stdout to a string?将输出从标准输出重定向到字符串?
【发布时间】:2013-01-20 19:31:46
【问题描述】:

在 C 中 我想将进程的输出从标准输出重定向到写入“共享内存段”,可以将其视为 char 数组或带有指针的字符串
我知道有 dup2 但它将文件描述符作为参数而不是指向数组的指针。有没有办法将它重定向到一个字符串?

【问题讨论】:

    标签: c redirect stdout


    【解决方案1】:
    char string[SIZE];
    freopen("/dev/null", "a", stdout);
    setbuf(stdout, string);
    

    请参阅 freopensetbuf 了解它们的定义

    【讨论】:

    • 请注意,缓冲区大小必须恰好是BUFSIZ(以字节为单位)!如果它较小,您将有一个缓冲区溢出漏洞,如果它较大,它将永远不会被使用。如果您想缓冲超过 BUFSIZ 字节,此解决方案将不起作用。
    • 如何撤消此操作?需要撤消吗?
    【解决方案2】:

    这应该适用于 UNIX 系统:

    // set buffer size, SIZE
    SIZE = 255;
    
    char buffer[SIZE];
    freopen("/dev/null", "a", stdout);
    setbuf(stdout, buffer);
    printf("This will be stored in the buffer");
    freopen ("/dev/tty", "a", stdout);
    

    【讨论】:

    • 谢谢,搜索了很多年试图找到如何做到这一点。几点!)需要 c99 或更高版本,2)我必须设置 buffer[SIZE]={0} 以避免尾随垃圾,3)如果您将“/dev/tty”替换为“CON”,也可以在 Windows 上运行。
    【解决方案3】:

    你可以写入一个管道,然后从它读取到共享内存中(也就是说,如果你不能使用管道代替共享内存中的字符串)。

    【讨论】:

    • 我有两个不同的进程(不是子进程和父进程),所以我不能在它们之间做管道。对吗?
    【解决方案4】:

    使用shm_open,您可以拥有一个指向共享内存的文件描述符并将其传递给 dup2 函数,如下所示:

    int fd = shm_open("shm-name", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    dup2(fd, STDOUT_FILENO);
    fprintf(stdout, "This is string is gonna be printed on shared memory");
    

    毕竟要从头开始寻找共享内存(使用 lseek 读取它并将其保存到字符串中;但要小心

    您还可以在Here 中找到缓冲到管道中的示例

    【讨论】:

      【解决方案5】:

      为了将标准输出简单地重定向到内存字符串,只需这样做:

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #define PATH_MAX 1000
      
      int main()
      {
          FILE *fp;
          int status;
          char path[PATH_MAX];
      
          fp = popen("ls ", "r");
      
          if (fp == NULL)  return 0;
      
      
          while (fgets(path, PATH_MAX, fp) != NULL)
              printf("\nTest=> %s", path);
      
          status = pclose(fp);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-10
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-30
        • 2012-08-15
        相关资源
        最近更新 更多