加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

了解K&R的putc宏:K&R第8章(Unix系统接口)练习2

发布时间:2020-12-15 22:11:30 所属栏目:安全 来源:网络整理
导读:我一直试图了解K R的putc版本已经有一段时间了,而且我没有资源(google,堆栈溢出,clcwiki没有我想要的东西,我没有朋友或同事求助于).我先解释一下背景,然后要求澄清. 本章的这一章介绍了描述文件的数据结构示例.该结构包括用于一次读取和写入大块的字符缓冲区
我一直试图了解K& R的putc版本已经有一段时间了,而且我没有资源(google,堆栈溢出,clcwiki没有我想要的东西,我没有朋友或同事求助于).我先解释一下背景,然后要求澄清.

本章的这一章介绍了描述文件的数据结构示例.该结构包括用于一次读取和写入大块的字符缓冲区.然后他们要求读者写一个标准库putc的版本.

作为读者的线索,K& R编写了一个支持缓冲和非缓冲读取的getc版本.他们还编写了putc宏的骨架,让用户自己编写函数_flushbuf(). putc宏看起来像这样(p是指向文件结构的指针):

int _flushbuf(int,FILE *);
#define putc(x,p)        (--(p)->cnt >= 0  
                       ? *(p)->ptr++ = (x) : _flushbuf((x),p)
typedef struct {
        int   cnt;  /*characters left*/
        char *ptr;  /*next character position*/
        char *base; /*location of buffer*/
        int   flag; /*mode of file access*/
        int   fd;   /*file descriptor*/
} FILE;

令人困惑的是,宏中的条件实际上是测试结构的缓冲区是否已满(这在文中说明) – 作为旁注,getc中的条件完全相同但意味着缓冲区为空.奇怪的?

这是我需要澄清的地方:我认为putc中的缓冲写入存在一个相当大的问题;因为写入p只在_flushbuf()中执行,但_flushbuf()仅在文件结构的缓冲区已满时调用,然后只有在缓冲区完全填满时才进行写入.缓冲读数的大小始终是系统的BUFSIZ.除了’BUFSIZ’字符之外的任何其他内容都不会发生,因为_flushbuf()永远不会在putc中调用.

putc适用于无缓冲写入.但是宏的设计使得缓冲写入几乎完全没有意义.这是正确的,还是我在这里遗漏了什么?为什么会这样?我非常感谢这里的所有帮助.

解决方法

如果写得足够多,缓冲区最终会变满.如果不这样做,您最终将关闭该文件(或者运行时将在main()返回时为您执行此操作)并且fclose()调用_flushbuf()或其等效文件.或者你将手动fflush()流,这也相当于_flushbuf().

如果你要写几个字符然后调用sleep(1000),你会发现很长一段时间都没有打印出来.这确实是它的工作方式.

getc和putc中的测试是相同的,因为在一种情况下,计数器记录可用的字符数,在另一种情况下,它记录可用的空间量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读