14-总结
5.13 总结
本章介绍了原子操作的概念,这对于一些系统调用的正确操作至关重要。特别是,指定O_EXCL标志调用open(),这确保了调用者就是文件的创建者。而指定O_APPEND标志来调用open(),还确保了多个进程在对同一文件追加数据时不会覆盖彼此的输出。
系统调用fcntl()可以执行许多文件控制操作,其中包括:修改打开文件的状态标志、复制文件描述符。使用dup()和dup2()系统调用也能实现文件描述符的复制功能。
本章接着研究了文件描述符、打开文件句柄和文件i-node之间的关系,并特别指出这 3个对象各自包含的不同信息。文件描述符及其副本指向同一个打开文件句柄,所以也将共享打开文件的状态标志和文件偏移量。
之后描述的诸多系统调用,是对常规 read()和 write()系统调用的功能扩展。pread()和pwrite()系统调用可在文件的指定位置处执行I/O功能,且不会修改文件偏移量。readv()和writev()系统调用实现了分散输入和集中输出的功能。preadv()和pwritev()系统调用则集上述两对系统调用的功能于一身。
使用truncate() 和ftruncate()系统调用,既可以丢弃多余的字节以缩小文件大小,又能使用填充为0的文件空洞来增加文件大小。
本章还简单介绍了非阻塞I/O的概念,后续章节中还将继续讨论。
LFS规范定义了一套扩展功能,允许在32位系统中运行的进程来操作无法以32位表示的大文件。
运用虚拟目录/dev/fd中的编号文件,进程就可以通过文件描述符编号来访问自己打开的文件,这在shell命令中尤其有用。
mkstemp()和tmpfile()函数允许应用程序去创建临时文件。