#define _GNU_SOURCE #include #include #include #include #include #include #define IOSIZE 32768 void dcp(int sfd, int dfd) { int zfd; int r, w; char *p; zfd = open("/dev/zero", O_RDWR); p = mmap(NULL, IOSIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, zfd, 0); close(zfd); while ((r = read(sfd, p, IOSIZE)) > 0) { w = write(dfd, p, r); if (w < r) break; } } int main(int argc, char *argv[]) { char c; int sfd, dfd; int ret; #ifdef SRC_DIRECT sfd = open(argv[1], O_RDONLY | O_DIRECT); //sfd = open(argv[1], O_RDONLY); dfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666); printf ("sfd ret = %d\n", sfd); printf ("dfd ret = %d\n", dfd); #else sfd = open(argv[1], O_RDONLY); dfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC | O_DIRECT, 0666); printf ("sfd ret = %d\n", sfd); printf ("dfd ret = %d\n", dfd); #endif #if 0 while ((ret = read(sfd, &c, 1)) > 0) { write (dfd, &c, 1); } #endif printf ("ret = %d\n", ret); dcp(sfd, dfd); return 0; }