1、pread和pwrite函数介绍
可以参考这篇:
UNIX环境编程(c语言)–文件I/O-文件共享_unix 共享文件夹_GuanFuXin优快云的博客-优快云博客
pread 函数是 Linux 系统中的一个系统调用函数,它的作用是从指 定文件的指定位置读取指定长度的数据。 pread 函数与 read 函数的 区别在于, pread 函数可以在读取数据时不改变文件指针的位置, 而 read 函数则会改变文件指针的位置。 在使用 pread 函数时,需要指定文件描述符、读取数据的缓冲区、 读取数据的长度以及读取数据的起始位置。因为没有移动offset,所以对多线程场景也很友好,函数的原型如下:
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
参数1:文件描述符 fd 。
参数2:用户空间的缓冲区 buf
参数3:count 表示要读取的字节数。
参数4:偏移量 offset
返回值:返回实际读取到的字节数;如果发生错误则返回-1。
pwrite函数是一种用于向文件中写入数据的系统调用函数。它与write函数类似,但具有更高的灵活性和可靠性。与write函数不同的是,pwrite函数允许我们指定从文件的哪个位置开始写入数据,而不是从当前位置开始。这对于并发写入文件的应用程序非常有用,因为它可以确保不会覆盖其他进程已经写入的数据。此外,pwrite函数还可以确保在写入时不会改变文件的偏移量,这意味着我们可以在不影响其他进程的情况下,以任意顺序编写文件。总而言之,pwrite函数是一种非常实用的系统调用函数,可以在多线程和多进程环境中提高应用程序的稳定性和可靠性。函数的原型如下:
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
参数1:文件描述符 fd 。
参数2:用户空间的缓冲区 buf
参数3:count 表示要写入的字节数。
参数4:偏移量 offset
返回值:返回实际读取到的字节数;如果发生错误则返回-1。
注意:
1、防止并发写入冲突:在多线程或多进程场景下,如果多个线程或进程同时向同一个文件中写入数据,会造成数据的混乱或丢失。使用pwrite函数可以避免这种情况的发生,因为它直接写入指定位置,不会修改文件指针。
-
写入长度的限制:pwrite函数一次只能写入一定长度的数据,如果要写入的长度超过该限制,就需要拆分成多个写入操作。
-
写入性能不如mmap:当需要写入的数据量较大时,使用mmap映射文件再进行写入操作会比pwrite函数的性能更高。
4.允许多个线程操作同一个文件描述符,不会互相影响彼此的文件偏移(offset),pwrite函数的seek和写入是原子操作,不会因为进程调度或者其他因素中断
原文链接:https://blog.youkuaiyun.com/suifen_/article/details/134624386