写入文件
此部分描述了 write 子例程。
| 子例程 | 描述 |
|---|---|
| 写入 | 将在 NBytes 变量中指定的数据量从由 Buffer 变量指定的空间添加到由 FileDescriptor 变量描述的文件。 它与 read 子例程功能相似。 在系统文件表的当前偏移量中发现写操作的字节偏移量。 |
如果写入的文件不包含与由写进程产生的字节偏移相对应的块,那么 write 子例程分配一个新块。 该新块被添加到定义文件的索引节点信息中。 如果底层文件系统需要添加块用于寻址文件块,添加新的块可以分配多于一个块。
写操作期间,索引节点是锁定的。 进行写操作时,不允许其他任何进程修改文件的内容。 然而,一旦写操作完成,文件就会立即解锁。 如果在两次写操作之间另一进程更改文件,那么结果数据不同,但保留数据结构的完整性。
write 子例程按和 read 子例程相似的方法循环,逻辑上为每次迭代将一个块写入到磁盘。 在每次迭代中,进程或者写入整个块,或只写入部分块。 如果完整一次操作只需要一部分数据块,那么 write 子例程从磁盘读取块以避免覆盖现有的信息。 如果需要整个块,它不会读取块,因为整个块都被覆盖。 写操作一块一块地继续处理,直到写入了 NBytes 参数中指定的字节数。
延迟写
您可以指定带有 O_DEFER 标记的延迟写。 然后,将数据作为临时文件传送到磁盘。 如果不久其他进程读或写这些数据,延迟写功能会高速缓存数据。 延迟写保存额外的磁盘操作。 许多程序(例如邮件和编辑器)在 /tmp 目录创建临时文件,并很快就除去它们。
当使用延迟更新 (O_DEFERRED) 标志打开文件时, 直到进程发出 fsync 子例程调用或进程发出同步 write 至文件 (使用 O_SYNC 标志打开) 之后,才会将数据写入永久存储器。 fsync 子例程将打开文件中的所有的更改保存到磁盘。 请参阅 open 子例程以获取 O_延迟 和 O_SYNC 标志的描述。
截断文件
truncate 或 ftruncate 子例程会更改常规文件的长度。 截断必须具有对文件的写权限。 Length 变量值指示截断操作完成后文件的大小。 所有的计量与文件的第一个字节相关,而非当前偏移量。 如果新长度(在 Length 变量中指定)短于以前的长度,那么除去二者之间的数据。 如果新长度长于现有长度,那么添加零以扩展文件大小。 当截断完成时,将完整的块返回到文件系统,并更新文件大小。