diff --git a/mmapcp b/mmapcp index 281795a..4d2067a 100644 Binary files a/mmapcp and b/mmapcp differ diff --git a/mmapcp.cc b/mmapcp.cc index ca9d937..7fc94d3 100644 --- a/mmapcp.cc +++ b/mmapcp.cc @@ -6,54 +6,28 @@ #include #include -int main(int argc, char *argv[]) -{ +int main (int argc, char *argv[]) { int s, s2, d; - struct stat st; - struct stat s2t; + struct stat st, s2t; void *sp, *s2p, *dp; s = open(argv[1], O_RDONLY); - if (s == -1) { - perror("open source"); - exit(1); - } + if (s == -1) { perror("open source"); exit(1); } s2 = open(argv[2], O_RDONLY); - if (s2 == -1) { - perror("open source2"); - exit(1); - } - d = open(argv[3], O_RDWR | O_CREAT | O_TRUNC, 0644); - if (d == -1) { - perror("open destination"); - exit(1); - } - if (fstat(s, &st)) { - perror("stat source"); - exit(1); - } - if (fstat(s2, &s2t)) { - perror("stat source2"); - exit(1); - } - if (ftruncate(d, st.st_size + s2t.st_size)) { - perror("truncate destination"); - exit(1); - } + if (s2 == -1) { perror("open source2"); exit(1); } + d = open(argv[3], O_WRONLY | O_CREAT, 0644); + if (d == -1) { perror("open destination"); exit(1); } + if (fstat(s, &st)) { perror("stat source"); exit(1); } + if (fstat(s2, &s2t)) { perror("stat source2"); exit(1); } + if (ftruncate(d, st.st_size + s2t.st_size)) { perror("truncate destination"); exit(1); } sp = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, s, 0); - if (sp == MAP_FAILED) { - perror("map source"); - exit(1); - } + if (sp == MAP_FAILED) { perror("map source"); exit(1); } + madvise(sp, st.st_size, MADV_SEQUENTIAL); s2p = mmap(NULL, s2t.st_size, PROT_READ, MAP_SHARED, s2, 0); - if (s2p == MAP_FAILED) { - perror("map source2"); - exit(1); - } + if (s2p == MAP_FAILED) { perror("map source2"); exit(1); } + madvise(s2p, s2t.st_size, MADV_SEQUENTIAL); dp = mmap(NULL, st.st_size + s2t.st_size, PROT_WRITE | PROT_READ, MAP_SHARED, d, 0); - if (dp == MAP_FAILED) { - perror("map destination"); - exit(1); - } - memcpy(dp, sp, st.st_size); + if (dp == MAP_FAILED) { perror("map destination"); exit(1); } + madvise(dp, st.st_size + s2t.st_size, MADV_SEQUENTIAL); + memcpy(mempcpy(dp, sp, st.st_size), s2p, s2t.st_size); return 0; } diff --git a/out.txt b/out.txt index 4114125..97461a3 100644 Binary files a/out.txt and b/out.txt differ