LINUX.ORG.RU

Thread и переменные

 ,


0

1
#! /usr/bin/env tclsh
package require Thread
        
set t [thread::create {
    set res [exec sh -c "command"]
  }     
]        
        
after 300
thread::release   $t 

А можно из t именно через переменные как-то вытащить то, что sh -c "command" вернёт в stdout? Я так понимаю, что из-за thread::release даже не сработает set res, что вроде как логично. По сути, мне надо получить результат, который может быть за определенный интервал времени.

Ответ на: комментарий от macumazan

Как я люблю такие ТЗ (в которых существенные детали скрывают до момента реализации)… Кто же знал, что у тебя команда, которая не то, что за 300 миллисекунд не завершится, а не завершится вообще никогда.

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

TeopeTuK ★★★★★
()

то, что sh -c «command» вернёт в stdout?

есть chan pipe и есть thread::transfer .. пайпом делаешь пару, часть которая writable используешь в exec, часть которая readable отдаешь вызывающему треду. Или в основном делаешь пару и отдаёшь writable в тред

что-то типа

# сделали пару
lassign [ chan pipe ] rd wr
# стартовали тред
set tid [ thread::create thread::wait ]
# перепихнули туда один конец трубы
thread::transfer $tid $wr
# запустили команду
thread::send -async $tid [ list exec sh -c "command" @>$wr ]
# читаем из другого конца трубы
puts [ gets $rd ]
MKuznetsov ★★★★★
()