标准I / O流-fgets()缓冲类型

箱子

《 Unix环境下的高级编程》一书在第15章讨论了管道,它表明在处理标准I / O函数时,我们应注意缓冲类型。

不同的打开的标准I / O流的缓冲类型如下(在本书的第5章中进行了讨论):

  • 标准误差是 unbuffered
  • 连接到终端设备的流是 line-buffered
  • 所有其他流是 fully-buffered

当父级/子级连接到时,他们用来通信pipe的末端(FILE *根据接口应为类型对象)应fully-buffered根据上面的规则列表(因为它是连接到的流pipe)。但是该章中的示例代码的行为似乎并非如此fully-buffered

这是示例代码:

myuclc.c:

1   #include "apue.h"
2   #include <ctype.h>

3   int
4   main(void)
5   {
6       int     c;

7       while ((c = getchar()) != EOF) {
8           if (isupper(c))
9               c = tolower(c);
10          if (putchar(c) == EOF)
11              err_sys("output error");
12          if (c == '\n')
13              fflush(stdout);
14      }
15      exit(0);
16  }

popen1.c:

1   #include "apue.h"
2   #include <sys/wait.h>

3   int
4   main(void)
5   {
6       char    line[MAXLINE];
7       FILE    *fpin;
8
9       if ((fpin = popen("myuclc", "r")) == NULL)  // "myuclc" is executable file compile-link by "myuclc.c"
10          err_sys("popen error");
11      for ( ; ; ) {
12          fputs("prompt> ", stdout);
13          fflush(stdout);
14
15          if (fgets(line, MAXLINE, fpin) == NULL) /* read from pipe */
16              break;
17          if (fputs(line, stdout) == EOF)
18              err_sys("fputs error to pipe");
19      }
20      if (pclose(fpin) == -1)
21          err_sys("pclose error");
22      putchar('\n');
23      exit(0);
24  }

所以我的问题是:应该根据缓冲规则的fgets()第15行,为什么它表现为popen1.cfully-bufferedline-bufferedunbuffered

此外,我也试图setvbuf()之前fgets()到专门设置缓冲类型_IOFBF的(全缓冲)fpin,仍然不工作。

prompt> abc
abc
prompt> ABC
abc
prompt> efg
efg
prompt> EFG
efg
prompt>
杰福伯格

在myuclc.c中,您对每个换行符执行显式刷新:

12          if (c == '\n')
13              fflush(stdout);

这将导致流被手动行缓冲。每当您冲洗管道时,另一端的进程都将被解除阻塞,并将读取当时缓冲区中的内容。

“缓冲规则”讨论的是何时自动发生刷新。在每个写命令(fprintf,fputc等)之后,将自动刷新未缓冲的流。每当将换行符写入流缓冲流时,都会自动刷新行缓冲流。

当缓冲区已满,关闭流或编写器执行显式刷新时,将刷新所有流

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

标准I / O流-fgets()缓冲类型

来自分类Dev

与I / O中的流的缓冲区链接

来自分类Dev

发出命令时标准I / O流的状态是什么?

来自分类Dev

通过相应的标准I / O流输入/输出会失败吗?

来自分类Dev

I / O类缓冲

来自分类Dev

在关闭挂钩期间关闭I / O流

来自分类Dev

Java中的管道式I / O流

来自分类Dev

使用I / O流的分段错误

来自分类Dev

I / O流标志如何工作?

来自分类Dev

I / O总线标准和设备控制器

来自分类Dev

Unix STREAMS与标准流

来自分类Dev

为什么缓冲I / O比未缓冲I / O快

来自分类Dev

标准输出缓冲问题

来自分类Dev

标准输出缓冲问题

来自分类Dev

管道<I / O>流。我可以传递复杂的物体吗?

来自分类Dev

使用Java I / O通过HTTP网络读取流

来自分类Dev

符号表达式流I / O

来自分类Dev

I / O流与外部设备之间的关系是什么

来自分类Dev

提高I / O绑定张量流训练速度

来自分类Dev

Java套接字I / O流空指针异常

来自分类Dev

如何知道哪些程序支持流I / O

来自分类Dev

无法正确读取文件-数据I / O流

来自分类Dev

如何在 Java 中关闭嵌套的 I/O 流

来自分类Dev

标准流适配器

来自分类Dev

C标准I / O的限制以及为什么我们不能将C标准I / O与套接字一起使用

来自分类Dev

Chicken方案中的缓冲I / O?

来自分类Dev

FFMPEG I / O输出缓冲器

来自分类Dev

为什么异步I / O需要缓冲?

来自分类Dev

为什么标准输出缓冲?