2015-12-11 2 views
0

Как открыть канал, который не является именем файла в tcl? Я прочитал документацию, но я не программист, так что я не должен понять, открытый и чан команды, потому что, когда я пытаюсь открыть новый пользовательский каналTcl открытый канал

open customchannel1 RDWR 

я получаю ошибки, такие как

не смог выполнить «customchannel1»: нет такого файла или каталога

И я прекрасно понимаю, что я не делаю это правильно:

chan create read customchannel1 

недействительны имя команды «customchannel1» ... и ... недопустимое имя команды «инициализировать»

Все, что я хочу, это два Tcl скрипты, чтобы иметь возможность разговаривать друг с другом. Я думал, что могу использовать каналы для этого.

я, однако, успешно создали тестовую версию сокета, что я хочу:

proc accept {chan addr port} { 
    puts "$addr:$port says [gets $chan]" 
    puts $chan goodbye     
    close $chan       
}           

puts -nonewline "master or slave? " 
flush stdout 
set name [gets stdin] 

if {$name eq "master"} { 
    puts -nonewline "Whats the port? " 
    flush stdout 
    set port [gets stdin] 
    socket -server accept $port 
    vwait forever 
} else { 
    puts "slave then." 
    puts -nonewline "Whats the id? " 
    flush stdout 
    set myid [gets stdin] 
    set chan [socket 127.0.0.1 $myid] 
    puts $chan hello 
    flush $chan 
    puts "127.0.0.1:$myid says [gets $chan]" 
    close $chan 
} 

В приведенном выше примере я могу запустить 3 экземпляра программы: 2 «мастера» с различными номерами портов и «раб», который может разговаривать с одним из них, в зависимости от выбранного порта/«id».

Если я знал, как открыть канал с помощью команды open вместо команды socket, я мог бы реализовать вышеуказанный код без использования сокетов или jimmy-фальсификации портов, которые будут использоваться как uniq-идентификаторы, но каждый пример, который я могу найти открывает файлы и записывает файлы или стандарты, которые вам не нужно создавать в первую очередь.

Спасибо, что помогли мне понять эти концепции и как их реализовать лучше!

+1

Я придерживался гнезда. Вы можете исследовать с помощью FIFO или 'tcl :: chan :: *' modules [in tcllib] (http://core.tcl.tk/tcllib/doc/trunk/embedded/www/toc.html) –

ответ

1

При соединении двух сценариев вместе, вы можете подумать с точки зрения использования конвейера. Например, вы можете запустить один скрипт в качестве подчиненного процесса другого. Мастер делает это:

set pipe [open |[list [info nameofexecutable] $thescriptfile] "r+"] 

получить двунаправленным (потому что r+) трубопровода, чтобы поговорить с ребенком, который в свою очередь может просто использовать стандартный вывод и стандартный ввод в обычном режиме.

Внутри процесса имеется chan pipe, который возвращает пару каналов, которые соединены анонимным трудом OS.


При работе с ними, это действительно помогает, если вы помните, чтобы использовать fconfigure превратить -buffering в none. В противном случае вы можете получить взаимоблокировки, в то время как вывод в канал находится где-то в буфере, чего вы не хотите. Конечным ответом на это является использование Expect, который использует Unix ptys вместо труб, но вы можете быть достаточно продуктивным, если не помните, чтобы настроить буферизацию.

+0

Насколько я понимаю, это открывает файл, с которым он может общаться, но как я могу открыть открытый канал для уже запущенной программы? Есть ли способ сделать это без фактического открытия нового экземпляра программы? –

2

Канал - это просто метод высокого уровня для работы с уже открытыми файлами или сокетами.

На странице руководства:

Эта команда обеспечивает несколько операций для чтения, записи и иным образом манипулируя открытые каналы (например, были созданы с помощью открытых и гнездовых команд или стандартного ввода по умолчанию имени каналов , stdout или stderr, которые соответствуют стандартным потокам ввода, вывода и ошибок потока соответственно).

Так что вы делаете с сокетами правильно. Вы можете использовать команду chan для настройки открытого сокета.