Spec-Zone.ru › Tcl/Tk

open

NAME
open — Открытие канала файла или командной цепочки
SYNOPSIS
DESCRIPTION
r
r+
w
w+
a
a+
RDONLY
WRONLY
RDWR
APPEND
BINARY
CREAT
EXCL
NOCTTY
NONBLOCK
TRUNC
КОМАНДНЫЕ ЦЕПОЧКИ
ПОРТОВЫЕ КОММУНИКАЦИИ
-mode baud,parity,data,stop
-handshake type
-queue
-timeout msec
-ttycontrol {signal boolean signal boolean ...}
-ttystatus
-xchar {xonChar xoffChar}
-pollinterval msec
-sysbuffer inSize
-sysbuffer {inSize outSize}
-lasterror
СИГНАЛЫ ПОРТА
TXD(выход)
RXD(вход)
RTS(выход)
CTS(вход)
DTR(выход)
DSR(вход)
DCD(вход)
RI(вход)
BREAK
КОДЫ ОШИБОК (только Windows)
RXOVER
TXFULL
OVERRUN
RXPARITY
FRAME
BREAK
ПРОБЛЕМЫ ПЕРЕНОСИМОСТИ
Windows
Unix
ПРИМЕР
СМОТРИТЕ ТАКЖЕ
КЛЮЧЕВЫЕ СЛОВА

Имя

open — Открытие канала файла или командной цепочки

Синопсис

open имяФайла
open имяФайла доступ
open имяФайла доступ разрешения

Описание

Эта команда открывает файл, последовательный порт или командную цепочку и возвращает идентификатор канала, который может использоваться в последующих вызовах команд, таких как read, puts и close. Если первый символ имяФайла не |, то команда открывает файл: имяФайла задаёт имя открываемого файла, и оно должно соответствовать соглашениям, описанным в справочном разделе filename.

Аргумент доступ, если он присутствует, указывает способ доступа к файлу (или командной цепочке). В первом варианте доступ может иметь следующие значения:

r
Открытие файла только для чтения; файл должен уже существовать. Это значение по умолчанию, если доступ не указан.
r+
Открытие файла для чтения и записи; файл должен уже существовать.
w
Открытие файла только для записи. Обнулить его, если он существует. Если он не существует, создать новый файл.
w+
Открытие файла для чтения и записи. Обнулить его, если он существует. Если он не существует, создать новый файл.
a
Открытие файла только для записи. Если файл не существует, создать новый пустой файл. Установить указатель файла в конец файла перед каждой записью.
a+
Открытие файла для чтения и записи. Если файл не существует, создать новый пустой файл. Установить начальную позицию доступа в конец файла.

Все допустимые значения доступ могут иметь символ b, добавленный как второй или третий символ в значении, чтобы указать, что открытый канал должен быть настроен как с опцией fconfigure -translation binary, делая канал подходящим для чтения или записи двоичных данных.

Во втором варианте, доступ состоит из списка любых из следующих флагов, все из которых имеют стандартные значения POSIX. Один из флагов должен быть либо RDONLY, WRONLY или RDWR.

RDONLY
Открытие файла только для чтения.
WRONLY
Открытие файла только для записи.
RDWR
Открытие файла для чтения и записи.
APPEND
Установить указатель файла в конец файла перед каждой записью.
BINARY
Настроить открытый канал с опцией -translation binary.
CREAT
Создать файл, если он ещё не существует (без этого флага ошибка, если файл не существует).
EXCL
Если также указан CREAT, возвращается ошибка, если файл уже существует.
NOCTTY
Если файл является терминальным устройством, этот флаг предотвращает превращение файла в управляющий терминал процесса.
NONBLOCK
Предотвращает блокировку процесса при открытии файла и, возможно, при последующих операциях ввода-вывода. Точное поведение этого флага зависит от системы и устройства; его использование не рекомендуется (лучше использовать команду fconfigure для перевода файла в режим без блокировки). Для получения подробной информации см. документацию вашей системы по флагу O_NONBLOCK системного вызова open.
TRUNC
Если файл существует, он усекается до нулевой длины.

Если новый файл создаётся при открытии, разрешения (целое число) используется для установки разрешений для нового файла в сочетании с маской создания режима файла процесса. Разрешения по умолчанию равны 0666.

Командные цепочки

Если первый символ имяФайла — “|”, то оставшиеся символы имяФайла обрабатываются как список аргументов, описывающих командную цепочку для вызова, в том же стиле, что и аргументы для exec. В этом случае идентификатор канала, возвращаемый open, может использоваться для записи в командную входную трубу или чтения из её выходной трубы, в зависимости от значения доступ. Если используется доступ только для записи (например, доступ — “w”), то стандартный вывод для цепочки направляется в текущий стандартный вывод, если не переопределяется командой. Если используется доступ только для чтения (например, доступ — “r”), стандартный ввод для цепочки берётся из текущего стандартного ввода, если не переопределяется командой. Идентификатор запущенного процесса доступен через команду pid, используя идентификатор канала, возвращённый open, в качестве аргумента.

Если команда (или одна из команд) в командной цепочке возвращает ошибку (согласно определению в exec), при вызове close на канале генерируется ошибка Tcl, если цепочка не в режиме без блокировки, то не возвращается код выхода (беззвучное close с -blocking 0).

Часто полезно использовать команду fileevent с цепочками, чтобы другие процессы могли происходить одновременно с выполнением команды в фоновом режиме.

Портовые коммуникации

Если имяФайла относится к последовательному порту, то указанный последовательный порт открывается и инициализируется способом, зависящим от платформы. Допустимые значения для имяФайла, используемые для открытия последовательного порта, описаны в разделе ПРОБЛЕМЫ ПЕРЕНОСИМОСТИ.

Команда fconfigure может использоваться для запроса и установки дополнительных конфигурационных параметров, специфичных для последовательных портов (где это поддерживается):

-mode baud,parity,data,stop
Этот параметр представляет собой набор из 4 значений, разделённых запятыми: скорость передачи, чётность, количество битов данных и количество стоповых битов для этого последовательного порта. Скорость baud — просто целое число, определяющее скорость соединения. Parity — одна из следующих букв: n, o, e, m, s; соответственно обозначающие варианты чётности «нет», «нечётная», «чётная», «метка» или «пробел». Data — количество битов данных и должно быть целым числом от 5 до 8, а stop — количество стоповых битов и должно быть целым числом 1 или 2.
-handshake type
(Windows и Unix). Этот параметр используется для настройки автоматического управления рукопожатием. Обратите внимание, что не все типы рукопожатия могут поддерживаться вашей операционной системой. Параметр type не чувствителен к регистру.

Если type равен none, то любое рукопожатие выключено. rtscts активирует аппаратное рукопожатие. Сигналы аппаратного рукопожатия описаны ниже. Для программного рукопожатия xonxoff символы рукопожатия можно переопределить с помощью -xchar. Дополнительное аппаратное рукопожатие dtrdsr доступно только в Windows. Нет стандартной конфигурации рукопожатия, начальное значение зависит от настроек вашей операционной системы. Параметр -handshake не может быть запрошен.

-queue
(Windows и Unix). Параметр -queue может быть только запрошен. Он возвращает список из двух целых чисел, представляющих текущее количество байтов в очереди ввода и вывода соответственно.
-timeout msec
(Windows и Unix). Этот параметр используется для установки тайм-аута для операций блокированного чтения. Он определяет максимальный интервал между приёмом двух байтов в миллисекундах. Для систем Unix разрешение составляет 100 миллисекунд. Параметр -timeout не влияет на операции записи или неблокирующие чтения. Этот параметр не может быть запрошен.
-ttycontrol {signal boolean signal boolean ...}
(Windows и Unix). Этот параметр используется для настройки линий вывода рукопожатия (см. ниже) постоянно или для отправки сигнала BREAK по последовательному каналу. Имена signal не чувствительны к регистру. {RTS 1 DTR 0} устанавливает выход RTS в высокое состояние, а выход DTR — в низкое. Условие BREAK (см. ниже) включено и выключено с помощью {BREAK 1} и {BREAK 0} соответственно. Не рекомендуется изменять сигнал RTS (или DTR) при активном аппаратном рукопожатии rtscts (или dtrdsr). Результат может быть непредсказуемым. Параметр -ttycontrol не может быть запрошен.
-ttystatus
(Windows и Unix). Параметр -ttystatus может быть только запрошен. Он возвращает текущий режим модемного статуса и сигналы ввода рукопожатия (см. ниже). Результат представляет собой список пар «сигнал-значение» с фиксированным порядком, например, {CTS 1 DSR 0 RING 1 DCD 0}. Имена signal возвращаются в верхнем регистре.
-xchar {xonChar xoffChar}
(Windows и Unix). Этот параметр используется для запроса или изменения символов программного рукопожатия. Обычно операционная система должна использовать значения по умолчанию DC1 (0x11) и DC3 (0x13), представляющие стандартные ASCII-символы XON и XOFF.
-pollinterval msec
(Только Windows). Этот параметр используется для установки максимального времени между опросом событий файлов. Это влияет на интервал времени между проверкой событий в интерпретаторе Tcl (самое маленькое значение всегда берется). Используйте этот параметр только если вы хотите опросить последовательный порт чаще или реже, чем 10 мс (значение по умолчанию).
-sysbuffer inSize
-sysbuffer {inSize outSize}
(Только Windows). Этот параметр используется для изменения размера системных буферов Windows для последовательного канала. Особенно при более высоких скоростях связи размер буфера ввода по умолчанию в 4096 байт может быть превышен для устаревших систем. Первый вариант определяет размер буфера ввода, во втором варианте определяются буферы ввода и вывода.
-lasterror
(Только Windows). Этот параметр только для запроса. В случае ошибки связи, read или puts возвращает общую ошибку ввода-вывода файла Tcl. fconfigure -lasterror может быть вызван для получения списка подробностей об ошибке. Ниже приведено объяснение различных кодов ошибок.

Сигналы последовательного порта

RS-232 — наиболее часто используемый стандартный электрический интерфейс для последовательной связи. Отрицательное напряжение (-3В..-12В) определяет бит метки (вкл=1), а положительное напряжение (+3..+12В) — бит пробела (выкл=0) (RS-232C). Для данных входящих и исходящих, линий статуса и рукопожатия определены следующие сигналы. Здесь мы используем термины «рабочая станция» для вашего компьютера и «модем» для внешнего устройства, потому что некоторые имена сигналов (DCD, RI) взяты из модемов. Конечно, ваше внешнее устройство может использовать эти линии сигналов для других целей.
TXD(выход)
Передаваемые данные: Исходящие последовательные данные.
RXD(вход)
Принятые данные: Входящие последовательные данные.
RTS(выход)
Запрос на передачу: Эта линия аппаратного рукопожатия информирует модем о том, что ваша рабочая станция готова к приёму данных. Ваша рабочая станция может автоматически сбрасывать этот сигнал, чтобы указать, что буфер ввода заполнен.
CTS(вход)
Разрешение на передачу: Дополнение к RTS. Указывает, что модем готов к приёму данных.
DTR(выход)
Готовность терминала данных: Этот сигнал сообщает модему, что рабочая станция готова к установлению связи. DTR часто включается автоматически при открытии последовательного порта.
DSR(вход)
Готовность набора данных: Дополнение к DTR. Сообщает рабочей станции, что модем готов к установлению связи.
DCD(вход)
Обнаружение несущей: Эта линия становится активной, когда модем обнаруживает сигнал «несущей».
RI(вход)
Указатель звонка: Становится активным, когда модем обнаруживает входящий вызов.
BREAK
Условие BREAK — это не линия аппаратного сигнала, а логический ноль на линиях TXD или RXD в течение длительного периода времени, обычно от 250 до 500 миллисекунд. Обычно сигнал данных приёма или передачи находится в состоянии метки (вкл=1) до тех пор, пока не будет передан следующий символ. BREAK иногда используется для сброса линии связи или изменения режима работы коммуникационного оборудования.

Коды ошибок (только Windows)

Во время операций последовательного чтения или опроса событий в фоновом режиме может возникнуть множество различных ошибок. Внешнее устройство может быть выключено, линии данных могут быть нестабильными, системные буферы могут быть переполнены, или параметры режима могут быть неправильными. Поэтому надёжное программное обеспечение всегда должно catch операции последовательного чтения. В случае ошибки Tcl возвращает общую ошибку ввода-вывода файла. Затем fconfigure-lasterror может помочь в поиске проблемы. Могут быть возвращены следующие коды ошибок.
RXOVER
Переполнение буфера ввода Windows. Данные поступают быстрее, чем скрипты их читают, или ваша система перегружена. Используйте fconfigure -sysbuffer, чтобы избежать временной задержки и/или ускорить свой скрипт.
TXFULL
Переполнение буфера вывода Windows. Дополнение к RXOVER. Эта ошибка практически не должна возникать, так как Tcl следит за состоянием буфера вывода.
OVERRUN
Переполнение буфера UART (аппаратное) с потерей данных. Данные поступают быстрее, чем системный драйвер их получает. Проверьте расширенные настройки последовательного порта, чтобы включить буфер FIFO (16550) и/или установить более низкое (1) значение порогового значения прерывания.
RXPARITY
UART обнаружил ошибку чётности. Неправильные настройки чётности с помощью fconfigure -mode или шумная линия данных (RXD) могут вызвать эту ошибку.
FRAME
UART обнаружил ошибку стопового бита. Неправильные настройки режима с помощью fconfigure -mode или шумная линия данных (RXD) могут вызвать эту ошибку.
BREAK
UART обнаружил состояние BREAK (см. выше).

Проблемы переноса

Windows
Допустимые значения для fileName для открытия последовательного порта имеют вид comX, где X — число, обычно от 1 до 9. Также допускается устаревшая форма comX:. Эта запись работает только для последовательных портов от 1 до 9. Попытка открыть последовательный порт, который не существует или имеет номер больше 9, завершится неудачей. Альтернативная форма открытия последовательных портов — использование имени файла //./comX, где X — любое число, соответствующее последовательному порту.
При интерактивном запуске Tcl могут возникать некоторые странные взаимодействия между реальной консолью, если она присутствует, и командной цепочкой, использующей стандартный ввод или вывод. Если открыта командная цепочка для чтения, некоторые строки, введённые в консоли, будут отправлены в командную цепочку, а некоторые — в интерпретатор Tcl. Если командная цепочка открыта для записи, нажатые клавиши в консоли не отображаются, пока цепочка не будет закрыта. Эти проблемы возникают только потому, что Tcl и дочернее приложение одновременно конкурируют за консоль. Если командная цепочка запускается из скрипта, так что Tcl не обращается к консоли, или если командная цепочка не использует стандартный ввод или вывод, но перенаправлена из или в файл, то вышеупомянутые проблемы не возникают.
Unix
Допустимые значения для fileName для открытия последовательного порта, как правило, имеют вид /dev/ttyX, где X — a или b, но может быть использовано любое имя псевдофайла, отображающего последовательный порт. Расширенные параметры конфигурации поддерживаются только для последовательных портов, когда Tcl скомпилирован с использованием POSIX-интерфейса последовательного порта.

При интерактивном запуске Tcl могут возникать некоторые странные взаимодействия между консолью, если она присутствует, и командной цепочкой, использующей стандартный ввод. Если открыта командная цепочка для чтения, некоторые строки, введённые в консоли, будут отправлены в командную цепочку, а некоторые — в интерпретатор Tcl. Эта проблема возникает только потому, что Tcl и дочернее приложение одновременно конкурируют за консоль. Если командная цепочка запускается из скрипта, так что Tcl не обращается к консоли, или если командная цепочка не использует стандартный ввод, а перенаправлена из файла, то вышеуказанная проблема не возникает.

Дополнительную информацию, не специфичную для командных цепочек, об выполнении приложений на разных платформах см. в разделе ПРОБЛЕМЫ ПЕРЕНОСА команды exec.

Пример

Откройте командную цепочку и перехватывайте ошибки:
set fl [open "| ls this_file_does_not_exist"]
set data [read $fl]
if {[catch {close $fl} err]} {
    puts "ls command failed: $err"
}

См. также

file, close, filename, fconfigure, gets, read, puts, exec, pid, fopen

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/open.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/open.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API