linux系统编程手册——第四章,通用IO模型

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 的用处?

  使用文件的特殊功能。

猜你喜欢

转载自www.cnblogs.com/yangxinrui/p/12188429.html