1. 添写至一个文件
任何一个需要多个函数调用的操作都不可能是原子操作,因为在两个函数调用之间,内核有可能会临时挂起该进程。
UNIX系统提供了一种方法使这种操作成为原子操作,该方法是在打开文件时设置O_APPEND标志。这就使内核每次对这种文件进行写之前,都将进程的当前偏移量设置到该文件的尾端处,于是在每次写之前就不再需要调用lseek。
2. pread和pwrite函数
Single UNIX Specification包括了XSI扩展,该扩展允许原子性地定位搜索(seek)和执行I/O。pread和pwrite就是这种扩展。
- #include <unistd.h>
- ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset);
返回值:读到的字节数,若已到文件结尾则返回0,若出错则返回-1
- ssize_t pwrite(int filedes, const void *buf, size_t nbytes, off_t offset);
返回值:成功返回已写的字节数,出错返回-1
调用pread相当于顺序调用lseek和read,但是pread又与这种顺序调用有下列重要区别:
- 调用pread时,无法中断其定位和读操作。
- 不更新文件指针。
3. 创建一个文件
参看open函数的O_CREAT和O_EXCL选项的说明。