我在使用库函数时遇到了一些麻烦。我必须编写一些使用库函数的 C 代码,该库函数在屏幕上打印其内部步骤。我对它的返回值不感兴趣,只对打印的步骤感兴趣。所以,我想我必须从标准输出中读取并将读取的字符串复制到缓冲区中。我已经尝试过 fscanf 和 dup2 但我无法从标准输出中读取。请问,谁能帮帮我?
问问题
18418 次
4 回答
15
上一个答案的扩展版本,不使用文件,而是在管道中捕获标准输出:
#include <stdio.h>
#include <unistd.h>
main()
{
int stdout_bk; //is fd for stdout backup
printf("this is before redirection\n");
stdout_bk = dup(fileno(stdout));
int pipefd[2];
pipe2(pipefd, 0); // O_NONBLOCK);
// What used to be stdout will now go to the pipe.
dup2(pipefd[1], fileno(stdout));
printf("this is printed much later!\n");
fflush(stdout);//flushall();
write(pipefd[1], "good-bye", 9); // null-terminated string!
close(pipefd[1]);
dup2(stdout_bk, fileno(stdout));//restore
printf("this is now\n");
char buf[101];
read(pipefd[0], buf, 100);
printf("got this from the pipe >>>%s<<<\n", buf);
}
生成以下输出:
this is before redirection
this is now
got this from the pipe >>>this is printed much later!
good-bye<<<
于 2016-02-07T03:42:03.853 回答
5
您应该能够打开管道,将写入端复制到 stdout,然后从管道的读取端读取,如下所示,并进行错误检查:
int fds[2];
pipe(fds);
dup2(fds[1], stdout);
read(fds[0], buf, buf_sz);
于 2013-06-12T17:37:06.727 回答
1
FILE *fp;
int stdout_bk;//is fd for stdout backup
stdout_bk = dup(fileno(stdout));
fp=fopen("temp.txt","w");//file out, after read from file
dup2(fileno(fp), fileno(stdout));
/* ... */
fflush(stdout);//flushall();
fclose(fp);
dup2(stdout_bk, fileno(stdout));//restore
于 2013-06-12T17:41:06.797 回答
0
我假设您的意思是标准输入。另一个可能的功能是gets
,man gets
用来了解它是如何工作的(很简单)。请显示您的代码并解释您在哪里失败以获得更好的答案。
于 2013-06-12T17:35:05.843 回答