- 函数原型
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
- 与write与read的区别
实际作用与read+lseek函数作用相同,区别是pread执行后,不会改变文件指针的偏移,且pread是原子操作,无法中断其定位和读操作。
pwrite_write.cpp
#include <unistd.h>
#include <iostream>
#include <memory.h>
#include <stdlib.h>
#include <fcntl.h>
using namespace std;
#define BUFFSIZE 20
char name[] = "HELLO WORLD";
void pwriteTest(int fd)
{
char buf[BUFFSIZE];
pwrite(fd,name,5,0);
read(fd,buf,5);
cout << buf << endl;
}
void writeTest(int fd)
{
char buf[BUFFSIZE];
write(fd,name,5);
read(fd,buf,5);
cout << buf << endl;
}
int main()
{
int fd;
fd = open("./write.txt",O_RDWR);
//pwriteTest(fd);
writeTest(fd);
return 0;
}
pread_read.cpp
#include <unistd.h>
#include <iostream>
#include <fcntl.h>
#include <stdlib.h>
#include <memory.h>
using namespace std;
#define BUFFSIZE 20
//read.txt -> 123456
void preadTest(int fd)
{
char buf[BUFFSIZE];
memset(&buf,0,0);
cout << "pread" << endl;
pread(fd,buf,3,2);
cout << buf <<endl;
// memset(&buf,0,0);
read(fd,buf,3);
cout << buf <<endl;
}
void readTest(int fd)
{
char buf[BUFFSIZE];
cout << "read" << endl;
read(fd,buf,3);
cout << buf << endl;
// memset(&buf,0,0);
read(fd,buf,3);
cout << buf << endl;
}
int main()
{
int fd;
fd = open("./read.txt",O_RDWR);
//preadTest(fd);
readTest(fd);
return 0;
}
执行pread_read:
执行pwrite_write:
打印的是未知信息,因为write函数已经将文件指针偏移到5字节之后,读取的自然是位置内容