Когда вы сделаете первый:
set AAA [exec tclsh "scriptA.tcl"]
программа Tcl (или, по крайней мере, текущий поток в этой программе), в которой вы положили это заявление не продолжается до завершения подпроцесса. Tcl останавливается и ждет его.
Другой вариант (который не использует open
или bgexec
) является поставить &
как последний аргумент:
set AAA [exec tclsh "scriptA.tcl" &]
Однако, в этом случае подпроцесс запускается в фоновом режиме и нет никакой реальной подключение к мастер-процессу, которое продолжается немедленно. Переменная AAA
в этом случае не будет содержать выход из программы, а скорее идентификатор процесса подпроцесса; вы можете использовать этот идентификатор с помощью обычных системных инструментов вашей платформы для его мониторинга. (Многие unixes позволяют вам посмотреть на /proc/$processID
, чтобы узнать информацию о запущенных процессах. Не все, хотя и не стандартизованы, а содержимое этого каталога действительно не стандартизировано. Вы также можете посмотреть, какие инструменты пакет TclX , некоторые из них могут использовать идентификатор процесса, если вы знаете, как использовать системные вызовы POSIX, которые он обертывает.)
В Tcl 8.6 мы добавили другие возможности для мониторинга и обработки подпроцесса: вы можете сделать подлинную OS-понятная однонаправленная сырая неназванная труба с chan pipe
(она подключена к паре каналов) и может закрывать только один конец двунаправленного канала, используя дополнительный аргумент close
. Это позволяет вам делать что-то вроде использования fileevent
для мониторинга подпроцесса, даже если вы сделали его с exec
, но на данный момент это не намного проще, чем с использованием open
. Команда exec
поддерживает подключение каналов непосредственно к подпроцессам, но в настоящее время только для каналов, у которых есть реальные связанные с ними дескрипторы операционной системы (каналы, да, сокеты, да, терминалы, да, файлы, да, сложные сценарии, созданные с помощью chan create
, no).
В целом, мы рекомендуем вам держать вещи простыми:
exec …
, когда вы хотите запустить подпроцесс и ждать сразу за результат.
open |[list …]
, если вы хотите запустить подпроцесс в фоновом режиме и взаимодействовать с ним (или bgexec
, который предоставляет немного отличающийся интерфейс к той же функциональности). Помните, что Tcl fileevent
работает с трубопроводами и терминалами, а также сокетами.
exec … &
, если вы хотите запустить подпроцесс в фоновом режиме и полностью отказаться от него.
И в действительно сложных случаях, есть пакет Expect.