tcl / tk - Можем ли мы перенаправить стандартный вывод tcl в сокет? - PullRequest
2 голосов
/ 12 мая 2011

Я пытаюсь перенаправить мои stdout и stderr выходные данные в текстовый виджет, и я попытался Memchan сделать это, и это не работает .

Следующийопция, на которую мы смотрим, использует сокеты.Можем ли мы перенаправить tcl stdout в сокет?Если да, можете ли вы предоставить пример кода, чтобы продемонстрировать это?

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Можете ли вы запустить в подпроцесс? Это легко, если вы можете:

socket -server accept 12345   ;# pick your own port number...
proc accept {channel host port} {
    exec [info nameofexecutable] realScript.tcl \
            <@$channel >@$channel 2>@$channel &
}
vwait forever                 ;# run the event loop to serve sockets...

Запускает подпроцесс Tcl, выполняющий realScript.tcl для каждого входящего соединения сокета, и организует перенаправление stdin (<@) stdout (>@) и stderr (2>@) в сокет. Он также запускает подпроцесс в фоновом режиме (окончательный &), чтобы не блокировать входящие соединения. (Возможно, вы захотите проверить $host и $port на приемлемость перед запуском подпроцесса.)

Что еще лучше, в подпроцессе Tcl все равно автоматически обнаружит, что имеет дело с сокетами; команда fconfigure сможет увидеть конфигурацию сокета (даже если она, конечно, не может изменить порт, к которому она обращается).

0 голосов
/ 13 мая 2011

Что именно вы подразумеваете под "перенаправить мой стандартный вывод"? Вы имеете в виду, когда вы делаете puts foo, вы хотите, чтобы это пошло в сокет? Если это так, просто замените команду puts по умолчанию на вашу собственную, которая записывает данные в сокет. Вы делаете это, переименовывая puts во что-то другое, затем создавая свой собственный процесс с именем puts. Затем ваш прок будет использовать переименованную команду для фактического ввода-вывода, но вы можете вставить сокет в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...