写入文件

此部分描述了 write 子例程。

子例程 描述
写入 将在 NBytes 变量中指定的数据量从由 Buffer 变量指定的空间添加到由 FileDescriptor 变量描述的文件。 它与 read 子例程功能相似。 在系统文件表的当前偏移量中发现写操作的字节偏移量。

如果写入的文件不包含与由写进程产生的字节偏移相对应的块,那么 write 子例程分配一个新块。 该新块被添加到定义文件的索引节点信息中。 如果底层文件系统需要添加块用于寻址文件块,添加新的块可以分配多于一个块。

写操作期间,索引节点是锁定的。 进行写操作时,不允许其他任何进程修改文件的内容。 然而,一旦写操作完成,文件就会立即解锁。 如果在两次写操作之间另一进程更改文件,那么结果数据不同,但保留数据结构的完整性。

write 子例程按和 read 子例程相似的方法循环,逻辑上为每次迭代将一个块写入到磁盘。 在每次迭代中,进程或者写入整个块,或只写入部分块。 如果完整一次操作只需要一部分数据块,那么 write 子例程从磁盘读取块以避免覆盖现有的信息。 如果需要整个块,它不会读取块,因为整个块都被覆盖。 写操作一块一块地继续处理,直到写入了 NBytes 参数中指定的字节数。

延迟写

您可以指定带有 O_DEFER 标记的延迟写。 然后,将数据作为临时文件传送到磁盘。 如果不久其他进程读或写这些数据,延迟写功能会高速缓存数据。 延迟写保存额外的磁盘操作。 许多程序(例如邮件和编辑器)在 /tmp 目录创建临时文件,并很快就除去它们。

当使用延迟更新 (O_DEFERRED) 标志打开文件时, 直到进程发出 fsync 子例程调用或进程发出同步 write 至文件 (使用 O_SYNC 标志打开) 之后,才会将数据写入永久存储器。 fsync 子例程将打开文件中的所有的更改保存到磁盘。 请参阅 open 子例程以获取 O_延迟O_SYNC 标志的描述。

截断文件

truncateftruncate 子例程会更改常规文件的长度。 截断必须具有对文件的写权限。 Length 变量值指示截断操作完成后文件的大小。 所有的计量与文件的第一个字节相关,而非当前偏移量。 如果新长度(在 Length 变量中指定)短于以前的长度,那么除去二者之间的数据。 如果新长度长于现有长度,那么添加零以扩展文件大小。 当截断完成时,将完整的块返回到文件系统,并更新文件大小。