【问题标题】:redirect stdout to a variable in C将标准输出重定向到 C 中的变量
【发布时间】:2014-08-15 11:48:07
【问题描述】:

我已经对如何将标准输出重定向到 C 中的变量进行了大量研究,但没有成功。我所看到的只是将标准输出重定向到使用 dup2 和 freopen 的文件,这不是我需要的。我想知道是否可以将其重定向到变量而不首先将其重定向到文件?

我使用 ubuntu 和 C 来创建代码。我使用 GCC 4.7.3 作为编译器。

我确实使用了 dup2 和 freopen 并尝试做一些工作,但过了一段时间。我意识到先将其重定向到文件然后再重定向到变量是一个坏主意(因为将写入其中的数据)。我使用了 freopen,但它不起作用,可能是因为 gcc 4.7.3 没有包含它的库。

是否可以将标准输出重定向到变量?如果是,如何?如果你不知道具体怎么做。请给我一个想法,我将成为对此进行研究的人。

编辑帖子以添加我的代码

正如我上面提到的,我确实使用了 dup2 并将标准输出重定向到一个文件。下面的代码显示了我是如何做到的。它工作正常,但我意识到不应该将数据保存到文件中。如果可以只更改我的代码的一部分,我该怎么做才能将标准输出重定向到变量?

这是代码..

char com1[] = "sudo mmm\n"; 

if (execCom!=NULL)  
{
    fp=popen(com1,"w");

    com = strtok(execCom, "\n");

    // walk through other commands that is separated by \n 
    while( com != NULL ) 
    {
        strcpy(comR,"\0");
        strcat(comR,com);
        strcat(comR,"\n");
        fwrite(comR, 1, strlen(comR),fp);
        com = strtok(NULL, "\n");
    }

    pclose(fp);
    fclose(out);
}

【问题讨论】:

  • grep 并将 printf 更改为 sprintf ...
  • 你能描述一下你真正的问题吗?也就是说,不是这个具体的实现问题,而是你试图解决的最终问题。

标签: c variables stdout


【解决方案1】:

是的,这是可能的。

你需要测试这段代码,因为我没有编译器

顺理成章

#include <stdio.h>
#include <unistd.h>

int main()
{
       int fd[2];
       pipe(fd);
       if (fork() == 0) {
              dup2(fd[1], STDOUT_FILENO);
              execlp("ls","ls",NULL);
       } else {
              char buffer[1000];
              ssize_t size = read(fd[0], buffer, 1000);
              if ( (size>0) && (size<sizeof(buffer)) )
              {
                     buffer[size]='\0';
                     printf("%s\n", buffer);
              }
       }
}

当然,您需要进行错误检查,并且还可能在读取缓冲区时出现循环。

我猜你需要阅读手册页

【讨论】:

    【解决方案2】:

    认为fmemopen 应该可以做到这一点。

    #include <stdio.h>
    
    char buf[4096] = { 0 };
    
    int main(void) {
        fclose(stdout);
        stdout = fmemopen(buf, sizeof(buf), "w");
        setbuf(stdout, NULL);
    
        printf("foo");
    
        return strncmp(buf, "foo", 3);
    }
    

    这个程序在我的机器上返回 0,但是这里有几点需要注意:

    1. 据我所知,使用stdout 作为左值是未定义的。
    2. 例如,将 printf 替换为 puts 不起作用,可能是由于 (1)。

    【讨论】:

    • 嗯?这会将 your stdout 更改为内存缓冲区,但 OP 希望将 不同进程 的输出输出到他进程中的内存缓冲区中。
    • @unwind 它在哪里说明了另一个进程?
    • 嗨@wkz 实际上它是一系列命令。我需要先运行“sudo -passsword”然后运行命令。我已经修改了我的帖子。谢谢
    • 这里是新手——我看到 stdout 被更改为指向内存缓冲区,我们不应该也将其还原吗?
    【解决方案3】:

    这很简单,只要你有POSIX系统,你只需要使用

    int shm_open(const char *name, int oflag, mode_t mode);

    打开一个共享内存块。然后可以将其映射到您的内存空间并指向它的变量。最后你运行你的程序,将它的标准输出重定向到共享内存调用给出的文件描述符中。

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2012-08-15
      相关资源
      最近更新 更多