《Linux系统编程(第2版)》——2.8 定位读写

简介: 这两个调用和read()、write()调用的最主要区别在于它们完全忽略了当前文件位置;相反,pread()和pwrite()调用用的是参数pos值。此外,当调用完成时,它们不会更新文件位置指针。换句话说,任何read()和write()交替调用可能会破坏定位读写的结果。

本节书摘来自异步社区《Linux系统编程(第2版)》一书中的第2章,第2.8节,作者:【美】Robert Love著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.8 定位读写

Linux提供了两种read()和write()系统调用的变体来替代lseek(),每次读写操作时,都把文件位置作为参数,在完成时,不会更新文件位置。

read()的变体是pread():

screenshot

该调用会从文件描述符fd的pos位置开始读取,共读取count个字节到buf中。

write()的变体是pwrite():

screenshot

该调用从文件描述符fd的pos位置开始,从buf中写count字节到文件中。

这两个调用和read()、write()调用的最主要区别在于它们完全忽略了当前文件位置;相反,pread()和pwrite()调用用的是参数pos值。此外,当调用完成时,它们不会更新文件位置指针。换句话说,任何read()和write()交替调用可能会破坏定位读写的结果。

定位读写只适用于可查找的文件描述符,包括普通文件。pread()和pwrite()调用的语义相当于在read()或write()调用之前执行lseek()调用,但仍然存在以下三点区别。

1.pread()和pwrite()调用更易于使用,尤其是对于一些复杂的操作,比如在文件中反向或随机查找定位。

2.pread()和pwrite()调用在结束时不会修改文件位置指针。

3.最重要的一点,pread()和pwrite()调用避免了在使用lseek()时会出现的竞争。

由于线程共享文件表,而当前文件位置保存在共享文件表中,可能会发生这样的情况:进程中的一个线程调用lseek()后,在执行读写操作之前,另一个线程更新了文件位置。也就是说,当进程中存在多个线程操作同一个文件描述符时,lseek()有潜在竞争可能。这些竞争场景可以通过pread()和pwrite()调用来避免。

错误码
pread()和pwrite()调用执行成功时,分别返回读或写的字节数。如果pread()返回0,表示EOF;如果pwrite()返回0,表示什么都没写。出错时,两个调用都返回-1,并相应设置errno值。对于pread(),可能出现任何有效的read()或lseek() 的errno值。对于pwrite(),也可能出现任何有效的write ()或lseek()的errno值

相关文章
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
581 1
|
Linux C语言
【Linux系统编程】基础指令(二)(上)
【Linux系统编程】基础指令(二)
【Linux系统编程】基础指令(二)(下)
【Linux系统编程】基础指令(二)
|
Linux C语言
Linux读写锁源码分析
本文分析了读写锁的实现原理与应用场景,基于glibc 2.17源码。读写锁通过读引用计数、写线程ID、条件变量等实现,支持读优先(默认)和写优先模式。读优先时,写锁可能饥饿;写优先时,读线程需等待写锁释放。详细解析了`pthread_rwlock_t`数据结构及加解锁流程,并通过实验验证:2000个读线程与1个写线程测试下,读优先导致写锁饥饿,写优先则正常抢占锁。
470 19
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
807 13
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
913 2
|
Linux API C语言
C语言读写BMP文件-EasyBmp【 linux 平台】
**EasyBmp** 是一个49KB的轻量级C++图像处理库,专注于BMP格式,提供简单易用的API。它的特点是小巧、开源、易于理解和高度定制。通过示例代码展示了如何轻松读取、缩放和保存BMP图像。适合需要高效处理BMP图像的开发者。