writeable = write(destf, buffer, buffer_size);
должно быть
writeable = write(destf, buffer, readable);
В настоящее время вы пишете не количество прочитанных символов, а весь буфер, поэтому выходной файл слишком велик
Вы также неправильно управляете концом входного файла
Возвращаемое значение read :
Предложение:
/* you already check input and output file was open with success */
char buffer[buffer_size];
for(;;){
ssize_t readable = read(sourcef, buffer, buffer_size);
if(readable <= 0){
close(sourcef);
close(destf);
if (readable != 0)
/* not EOF */
exit_with_usage("Could not read.");
/* EOF */
break;
}
if (write(destf, buffer, n) != n) {
close(sourcef);
close(destf);
exit_with_usage("Could not write.");
}
}
Полагаю, exit_with_usage
вызывает exit()
, поэтому не возвращает
Примечание в теории запись может писать меньше ожидаемого количества символов, не будучиошибка, и запись должна выполняться в цикле, но в этом случае бесполезно управлять этим