我已经做过很多关于如何将stdout重定向到C中的变量但没有成功的研究。我所看到的是使用dup2和freopen将stdout重定向到文件,这不是我需要的。我想知道是否甚至可以将其重定向到变量而不首先将其重定向到文件?
我使用ubuntu和C来创建代码。我正在使用GCC 4.7.3作为编译器。
我确实使用过dup2和freopen并试图做一些工作但是过了一段时间。我意识到首先将它重定向到文件然后再变量是一个坏主意(因为将要写入它的数据)。我使用了freopen,但是它没有用,可能是因为gcc 4.7.3没有包含它的库。
是否可以将stdout重定向到变量?如果有,怎么样?如果你不确切知道如何。请给我一个想法,我就是那个研究它的人。
编辑帖子以添加我的代码
正如我上面提到的,我确实使用了dup2并将stdout重定向到一个文件。下面的代码显示了我是如何做到的。它工作但我意识到将数据保存到文件不应该是一个选项。如果它可以只更改我的代码的一部分,我该怎么做才能将stdout重定向到变量?
这是代码..
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);
}
答案 0 :(得分:2)
是的,这是可能的。
您需要测试此代码,因为我没有编译器
顺便说一句
#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);
}
}
}
当然,您需要进行错误检查,并且还可能有一个循环读取缓冲区。
我想你需要阅读手册页
答案 1 :(得分: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,但是这里有一些要注意的事项:
stdout
作为左值是未定义的。printf
替换puts
不起作用,可能是由于(1)。答案 2 :(得分:1)
只要您拥有POSIX系统,这很简单,只需使用
即可打开共享内存块。然后可以将其转换为您的内存空间和指向它的变量。最后,运行程序,将其stdout重定向到共享内存调用给出的文件描述符。