2017-01-12 2 views
0

У меня есть работа для скрипта TCL. В основном сценарии, я могу вызвать новый сценарий с помощью Exec сделать этоИспользование exec и fileevent для поддержки подпроцесса

set AAA [exec tclsh "scriptA.tcl"] 

и я могу прекратить подпроцесс прессового ввода, чтобы убить процесс.

fileevent stdin readable killproc 
vwait state 

Теперь я хочу сделать пусть это убить процесс в себе соответствующие автоматически, если мой подпроцесс работает функционально законченными и держать прессу войти убить Proc работу, как я могу реализовать, не используя open или bgexec, благодаря

ответ

0

Когда вы сделаете первый:

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.

Смежные вопросы