1.通用IO模型使用于哪些对象?
普通文件,管道,FIFO,终端,设备,socket
2.为什么进程启动后,都开启了标准文件符?
在程序启动前,shell为程序打开标准文件符,换句话说,程序继承了shell打开的文件描述符。
如果进行了重定向,shell会对标准文件描述符进行调整,再fork程序。
3.标准文件描述符有哪些?
0 STDIN_FILENO stdin
1 STDOUT_FILENO stdout
2 STDERR_FILENO stderr
4.为什么叫通用IO?
即使用通用IO api 的程序可用于一系列的文件,包括:普通文件,FIFO,管道,终端,socket,设备。
文件要能使用通用IO的前提是,实现了相同系统IO调用集。
若需要使用文件的特殊功能,可用 ioctl。
5.对于open 需要注意什么?
open的 pathname 参数,如果是 符号链接, 会进行解引用。
flag 中 O_CLOEXEC ,是在执行 exec 时,自动 close 文件描述符。
6.对于read需要注意什么?
read返回0,表示文件末尾。
一般我们这样写
char buf[MAX_READ + 1]; nbytes = read(fd, buf, MAX_READ); buf[nbytes] = 0;
由于read不会设置字符串末尾,所以需要定义额外的字节。
7.write 如果返回的值,小于应该写的值,是怎么回事?
若操作的是磁盘文件,说明磁盘满了。
8.lseek 需要注意什么?
lseek 偏移量可以为负值。
lseek不适用于 管道,FIFO,终端,socket(这几个的特点都是,读出,数据就没了)
lseek 的 l 表示 long 的意思,因为offset 是 long 类型。
9.空洞文件
空洞文件是linux 的特有,windows上没有(这就是为什么,迅雷下载的文件,为空洞文件时,仍然占用磁盘)。
空洞文件的特点是,文件大小 > 占用磁盘块。
只有写数据时,才分配磁盘空间,空的部分表示为空,且不分配空间。
磁盘分配是以块为单位,则若一个磁盘块如果只有一个字节数据写入,也会分配磁盘块。
10.ioctl 的用处?
使用文件的特殊功能。