Закрыть
Имя
Закрыть — Закрыть открытый каналСинопсис
close channelId ?r(ead)|w(rite)?Описание
Закрывает или полузакрывает канал, заданный channelId.ChannelId должен быть идентификатором открытого канала, такого как стандартный канал Tcl (stdin, stdout или stderr), значение, возвращаемое вызовом open или socket, или результат команды создания канала, предоставленной расширением Tcl.
Форма с одним аргументом — это просто «полное закрытие»: весь буферизованный вывод сбрасывается в устройство вывода канала, любой буферизованный ввод отбрасывается, базовый файл или устройство закрывается, и channelId становится недоступным для использования.
Если канал блокируется, команда не возвращает значение, пока весь вывод не будет сброшен. Если канал неблокирующий и есть несброшенный вывод, канал остается открытым, и команда возвращает значение немедленно; вывод будет сброшен в фоновом режиме, и канал будет закрыт по завершении всего сброса.
Если channelId является блокирующим каналом для командной цепочки, то close ожидает завершения дочерних процессов.
Если канал используется совместно между интерпретаторами, то close делает channelId недоступным в вызывающем интерпретаторе, но не имеет других последствий до тех пор, пока все интерпретаторы общего использования не закроют канал. Когда последний интерпретатор, в котором зарегистрирован канал, вызывает close, выполняются описанные выше действия очистки. См. команду interp для описания совместного использования каналов.
Каналы автоматически закрываются при уничтожении интерпретатора и при завершении процесса. Начиная с 8.6 (TIP#398), неблокирующие каналы больше не переключаются в блокирующий режим при выходе; это гарантирует своевременный выход даже при приостановке узла или канала связи. Чтобы обеспечить надлежащий сброс приостановленных неблокирующих каналов при выходе, теперь необходимо либо (а) активно переключать их обратно в блокирующий режим, либо (б) использовать переменную среды TCL_FLUSH_NONBLOCKING_ON_EXIT, которая при установке и не равной "0" восстанавливает предыдущее поведение.
Команда возвращает пустую строку и может сгенерировать ошибку, если при сбросе вывода произошла ошибка. Если команда в командной цепочке, созданной с помощью open, возвращает ошибку, close генерирует ошибку (аналогично команде exec).
Форма с двумя аргументами — это «полузакрытие»: для двунаправленного канала, такого как сокет или командная цепочка, и (возможно, сокращенного) направления она закрывает только подпоток в этом направлении. Это означает shutdown() для сокета и close() одного конца трубы для командной цепочки. Затем данные структуры канала уровня Tcl сохраняются или освобождаются в зависимости от того, открыто ли другое направление.
Закрытие с одним аргументом для уже полузакрытого двунаправленного канала определено как простое «завершение работы». Полузакрытие уже закрытой половины или неверного одностороннего канала вызывает ошибку.
В случае командной цепочки обязанности сбора дочерних процессов ложатся на плечи последнего закрытия или полузакрытия, которое, таким образом, допускается сообщать об ошибке аварийного выхода.
В настоящее время полузакрытие поддерживают только сокеты и командные цепочки. Будущее расширение позволит это сделать отраженным и стоп-каналом.
Пример
Это демонстрирует, как можно использовать Tcl для обеспечения закрытия файлов даже при возникновении ошибок, объединив catch, close и return:proc withOpenFile {filename channelVar script} {
upvar 1 $channelVar chan
set chan [open $filename]
catch {
uplevel 1 $script
} result options
close $chan
return -options $options $result
} См. также
file, open, socket, eof, Tcl_StandardChannels
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/close.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/close.htm