// cp // implemented with libc and *zero* error handling // dd bs=1M count=10 random_file // ./time ./cp_libc_one_byte random_file random_file_copy // strace ./cp_libc_one_byte random_file random_file_copy /* cp real 0m0.064s user 0m0.000s sys 0m0.015s lib real 0m8.057s user 0m0.772s sys 0m7.221s */ #include #include #include #include #include int main(int argc, char *argv[]) { // copy bytes one at a time from pathname passed as // command-line argument 1 to pathname given as argument 2 int read_file_descriptor = open(argv[1], O_RDONLY); int write_file_descriptor = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644); if(read_file_descriptor < 0){ perror(argv[1]); return 1; } if(write_file_descriptor < 0){ perror(argv[2]); return 1; } char c; ssize_t n_read; while( (n_read = read(read_file_descriptor, &c, 1)) > 0 ){ write(write_file_descriptor, &c, 1); } // good practice to close file descriptions as soon as finished using them // not necessary needed here as program about to exit close(read_file_descriptor); close(write_file_descriptor); return 0; }