Номер дескриптора файла (FD) не является специальным.stdin на FD 0, stdout на FD 1 и stderr на FD 2. это просто соглашение.
При входе в систему соответствующее оконечное устройство будет «подключено» к этим FD.Когда вы запускаете команду, она наследует дескрипторы, если вы не указали оболочке выполнить перенаправление.Но как только программа запустится, вы можете close
, dup
или open
FD, как вам нравится.
Вернуться к вашему вопросу:
stdout = open(0, "w")
stdout.write("Hello World") # Prints Hello World
stdout.close()
Несмотря на название, open
ничего не открывает в этом случае.Он создает файловый объект Python (с буферами и всем высокоуровневым содержимым) из уже открытого низкоуровневого FD, который на самом деле является просто числом (индексом таблицы открытых файлов в ядре).Для него была отдельная функция: os.fdopen
Немного интереснее то, что не существует стандартного способа изменить режим открытия с чтения на запись, а ваша программа пишет на ввод std,Ответ (по крайней мере, в Linux) заключается в том, что этого не происходит вообще.Как вы можете видеть с помощью lsof
, все 3 стандартных FD обычно открыты в режиме чтения / записи (помечены конечным знаком u
), например:
cmd 32154 user 0u CHR 136,7 0t0 10 /dev/pts/7
cmd 32154 user 1u CHR 136,7 0t0 10 /dev/pts/7
cmd 32154 user 2u CHR 136,7 0t0 10 /dev/pts/7
Таким образом, ваша программа просто пишет в FD 0который подключен к терминалу.