当前位置:嗨网首页>书籍在线阅读

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()函数允许应用程序去创建临时文件。