您的位置:首页 > 编程语言

unix环境高级编程第五章习题的一些拙见

2016-07-04 10:47 357 查看
开心,又到更新新的一章的时间了XD!

apue5_1:

这道题还是有意思的,虽然看上去比较简单,但是其中蕴含的东西还是比较多的。先把自己在这章中最重要的体会写下来吧!首先这一章讲的是IO流,那么IO流和直接的文件的系统调用有什么不同那?

我们先看一下read函数的原型size_t  read  (int  fd , void  *buf , size_t  nbytes);很显然我们在进行系统调用的时候要设置缓冲区,而缓冲区大小的设置其实是和系统有直接关系的,不然会影响系统调用的效率。而IO流之所以出现就是为了帮我们程序员隐藏这些信息,自己管理缓冲区,同时使系统调用的次数尽量少!这里标准IO库有几种管理缓冲区的方式,当然我个人在学习中认为一定要抓住无论是哪种缓冲区管理的方式只和流有关系!也就是缓冲区的管理方式是流的一种属性而与你已经IO的方式无关!

#include <stdio.h>
#include "apue.h"

void setbuf (FILE *restrict fp , char *restrict buf) {
int fd;

if (buf == NULL){
if (setvbuf (fp , NULL , _IONBF , BUFSIZ) != 0)
err_sys ("setvbuf for NULL failed");
}
else {
if ((fd = fileno (fp)) < 0)
err_sys ("fileno failed");

if (isatty (fd)) {
if (setvbuf (fp , buf , _IOLBF , BUFSIZ) != 0)
err_sys ("setvbuf for _IOLBF failed");
}else {
if (setvbuf (fp , buf , _IOFBF , BUFSIZ) != 0)
err_sys ("setvbuf for _IOFBF failed");
}
}
}
这个题目中有一个细节,书上在说明setbuf的时候说到,如果流是设备相关的,那么就可以将流设置为行相关的,在这里我看了一下isatty函数正好是实现这个功能的,用文件描述符来进行判断!使用fileno函数将文件流转换为文件描述符。

——————————————————————————————————分割线2016.7.4

apue5.2:

书上对每次一行的I/O操作说的比较明白,对于这个题目而言,程序首先会从指定的流中读三个字节(假设都不包括换行符),再进行下一次操作,若果有换行符的存在,那么就就直接进行下一次读取操作,直到读取的流道理结尾、

apue5.3:

这个送分题,在下c语言基础还算不错,返回的值是送入到标准输出流中的字节数目。

题外话:这几天没更新的缘故一是因为心情不是很好,而是因为这几天在折腾C++,我要看STL!,不说了,以后还是每天两个题目。

——————————————————————————————————————————分割线2016.7.8

apue5.4:

我记得当时学习c和指针的时候,书上说了这个问题,之所以要声明为int最主要的因素是因为EOF可以肯定会在int的范围内,但是char就不能肯定EOF在其的范围当中,所以我们再进行getchar操作的时候要注意它的声明类型。

apue5.5:

这个题目我仔细思考了给出的答案,我不是很肯定自己的解释,我觉得这个地方应该是有两个缓冲区,一个是用户缓冲区,一个是内核缓冲区。首先我们看fflush直接冲洗文件流的缓冲区中的内容(用户缓冲区)到内核缓冲区,再使用fileno函数将文件流描述符转换成文件描述符(之前的编程当中我使用过,所以印象还是比较深刻的),再使用fsync函数将制定的文件描述中的内容(内核缓冲区中的内容)写到磁盘上,直到所有的内容都写到磁盘上后函数才会返回。

apue5.6:

这个题目我有点不知道作者额意图是什么,这里没使用fllush很容易理解,在这里标准输入标准输出都是行缓冲的,每次读入一行之后不会再去缓冲,会这届冲洗掉,它输出提示信息应该是调用的自身的头文件中的内容,使用像err_sys这样的输出,这里我猜测应该使用的是标准错误。

apue5.7:

这里这个题目我就跳过了,我的系统并不是BSD的。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息