Consider this program (a basic implementation of cat):
#include <assert.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main() {
char buffer[4096];
ssize_t bytes_read;
while ( ( bytes_read = read(STDIN_FILENO, buffer, sizeof buffer) ) > 0) {
ssize_t bytes_written = write(STDOUT_FILENO, buffer, bytes_read);
if (bytes_written == -1) return errno;
assert(bytes_read == bytes_written);
}
if (bytes_read == -1) return errno;
assert(bytes_read == 0);
return 0;
}
I was wondering why this hangs waiting for read(2) input to be terminated with a \n, when I didn't specify something like readline().
My initial assumption for read was that it would return 0 whenever input wasn't available and the associated file descriptor open, and -1 (a common representation for EOF) when it was closed, and perhaps another negative integer for error.
After reading the manual, and writing the program, I was under the impression that read(2) would block until any input was available with size >0 and immediately return with that information; however, it seems the terminal causes it to block until it receives a \n character.
My question is: Why does this not adhere to my expectations, and what is really happening here?