第三章 文件 I/O

1.不带缓冲:每个read和write都调用内核中的一个系统调用。

2.不带缓冲的I/O函数不是ISO C的组成部分,但是,它们是POSIX.1和Single UNIX Specification的组成部分。

3.文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。

4.open函数:打开或创建一个文件。


第三个参数为可变参数,仅当创建新文件时才使用。

oflag参数可用下列一个或多个常量进行“或”运算构成:

三个必选一个:


可选:



注:由open返回的文件描述符一定是最小的未用描述符数值

5.常量_POSIX_NO_TRUNC决定了是要截短过长的文件名或路径名,还是返回一个出错。若此变量有效,则整个路径名超过PATH_MAX,或路径名中的任意文件名超过NAME_MAX,返回出错状态,并将errno设置为ENAMETOOLONG。

6.creat函数:


注:creat以只写方式打开所创建的文件。

7.close函数:关闭一个打开的文件


关闭一个文件时,还会释放该进程加在该文件上的所有记录锁。当一个进程终止时,内核自动关闭它所有打开的文件。

8.lseek函数:每个打开的文件都有一个与其关联的“当前文件偏移量”(current file offset)。通常是非负整数。当打开一个文件时,除非指定O_APPEND选项,否则该偏移量被设置为0.




若lseek执行成功,返回新的文件偏移量,如下:

off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
若文件描述符引用的是一个管道、FIFO或网络套接字,则lseek返回-1,并将errno设置为ESPIPE。

偏移量一般是非负值,也有可能是负值,所以测试lseek应该测试它是否等于-1。

9.空洞:文件偏移量大于文件长度时,对该文件的下一次写将在文件中造成一个空洞。空洞不占存储区,且全被读为0。



10.read函数:从打开文件中读取数据。


11.write函数:向打开的文件写数据


返回值通常与参数nbytes相同,否则为出错。若没制定O_APPEND选项,则从文件的当前偏移量开始写。再一次成功写后,该文件偏移量增加实际写的字节数。

12.文件共享:




文件描述符标志只用于一个进程的一个描述符,文件状态标志用于给定文件的任何进程中的所有描述符。

13.原子操作:由多步组成的操作,不能有多个函数的调用。要不不执行,要不就执行所有步骤。

14.pread和pwrite函数:

调用pread/pwrite相当于顺序调用lseek和read/write,但是有又区别:

1)无法终端定位和操作
2)不更新文件指针

15.duo和dup2函数:复制一个现存的描述符。


由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。dup2则可以通过filedes2制定新fd,若fd2打开,则先关闭,若fd=fd2,则返回fd2,不关闭。这些函数返回的心描述符与fd共享一个文件表项。


16.利用缓冲的读写称为延迟读写(delayed write)。

17.sync、fsync和fdatasync函数:


18.fcntl函数:



返回值与命令有关,出错为-1,成功则返回某个其他值。

19.ioctl函数:不能用其他函数表示的I/O操作都用这个函数。


20./dev/fd:打开目录中/dev/fd/n的文件等效于复制描述符n。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值