Добавить в корзинуПозвонить
Найти в Дзене
Машинное обучение

На UNIX stdout - это просто файловый дескриптор 1

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

На UNIX stdout - это просто файловый дескриптор 1.

И из-за этого можно поймать очень неприятный эффект: если закрыть stdout, следующий открытый файл может получить тот же дескриптор 1.

То есть код вроде этого:

close(1);

FILE *f = fopen("output.txt", "w");

printf("hello\n");

Может записать printf не в терминал, а прямо в output.txt.

Потому что система обычно выдаёт минимальный свободный файловый дескриптор. Закрыл 1 - значит он снова свободен. Открыл файл - он может стать новым stdout.

Мелочь, но именно из таких мелочей и состоит настоящее понимание UNIX.