Seeking and I/O Combined
The pread() and pwrite() system calls combine the effects of lseek() and read() (or write()) into a single system call. This provides some improvement in performance although the net effect will only really be visible in an application that has a very I/O intensive workload. However, both interfaces are supported by the Single UNIX Specification and should be accessible in most UNIX environments. The definition of these interfaces is as follows:
#include <unistd.h> ssize_t pread(int fildes, void buf, size_t nbyte, off_t offset); ssize_t pwrite(int fildes, const void buf, size_t nbyte, off t offset);
The example below continues on from the dd program described earlier and shows the use of combining the lseek() with read() and write() calls:
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 #include <fcntl.h> 4 #include <unistd.h> 5 6 main(int argc, char argv) 7 { 8 char *buf; 9 int ifd, ofd, nread; 10 off_t inoffset, outoffset; 11 size_t insize, outsize; 12 13 if (argc != 7) { 14 printf(“usage: mydd infilename in_offset” 15 “ in_size outfilename out_offset” 16 “ out_size\n”); 17 } 18 ifd = open(argv[1], O_RDONLY); 19 if (ifd < 0) { 20 printf(“unable to open %s\n”, argv[1]); 21 exit(1); 22 } 23 ofd = open(argv[4], O_WRONLY); 24 if (ofd < 0) { 25 printf(“unable to open %s\n”, argv[4]); 26 exit(1); 27 } 28 inoffset = (off_t)atol(argv[2]);
29 insize = (size_t)atol(argv[3]); 30 outoffset = (off_t)atol(argv[5]); 31 outsize = (size_t)atol(argv[6]); 32 buf = ...
Get UNIX Filesystems: Evolution, Design, and Implementation now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.