На UNIX stdout - это просто файловый дескриптор 1
И из-за этого можно поймать очень неприятный эффект: если закрыть stdout, следующий открытый файл может получить тот же дескриптор 1. То есть код вроде этого: close(1); FILE *f = fopen("output.txt", "w"); printf("hello\n"); Может записать printf не в терминал, а прямо в output...