read возвращает -1, потому что fd недопустим, вы сохраняете это в bytes_read, который имеет тип size_t, который не имеет знака, поэтому ваш цикл печатает (size_t) -1 символ, который является очень большим числом, намного большим, чем размер буфера. Итак, вы распечатываете большую часть вашего адресного пространства, а затем получаете ошибку, когда в конце концов достигаете конца и получаете доступ к неверному адресу.
Как уже упоминали другие (не отвечая на ваш фактический вопрос), вы должны проверять результаты открытия на наличие ошибок. например,
int fd = open(argv[1], O_RDONLY);
if( fd < 0 ){
fprintf(stderr, "error opening %s: %s\n", argv[1], strerror(errno));
exit(1);
}
Предупреждение: если вы делаете другой системный вызов или вызываете любую подпрограмму, которая может выполнить системный вызов (например, printf) перед вызовом strerror, вы должны сохранить errno и затем передать сохраненную копию в strerror.
Еще одна заметка о вашей программе:
while(bytes_read == sizeof(buffer))
Это не очень хороший тест, потому что read может вернуть меньше, чем вы просите. Ваш цикл должен продолжаться, пока чтение не вернется <= 0. </p>