文章目录 一、函数声明二、解释三、实例四、意义
一、函数声明 #include <unistd.h>ssize_t preadint fd, void *buf, size_t count, off_t offset);ssize_t pwriteint fd, const void *buf, size_t count, off_t offset); 二、解释
pread其实是lseek和read的组合成的原子操作。(通过一次系统调用完成,lseek和read)
write同理。lseek和write
三、实例 #include <sys/types.h>#include <unistd.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#include <stdlib.h>#include <stdio.h>int mainint argc, char **args) { int fd = open”test1″, O_RDWR|O_CREAT, S_IRWXU); char *p_buf = 0; int str_len = -1; if argc < 2) { printf”please input args\n”); exit-1); } str_len = strlen*args + 1)); p_buf = char *)mallocstr_len + 1); pwritefd, *args + 1), str_len, 0); preadfd, p_buf, str_len + 1, 0); printf”%s\n”, p_buf); freep_buf); return 0;} // 运行结果hotice0@ubuntu:~/Documents/Unix_Program$ ./file-io/pwrite_write hotice0hotice0
实际上就是将bash传给程序的第二个参数,写入到文件并从文件读取。
四、意义
可以看到写入或者读取,只需要进行一次系统调用。相比lseek、write,lseek、read实现这个程序。少了一半的系统调用。减少系统调用就,可以用于特殊场景的性能优化。