Как открыть STDIN процесса в Ruby? - PullRequest
1 голос
/ 17 ноября 2010

У меня есть набор задач, которые мне нужно запустить из сценария Ruby, однако одна конкретная задача всегда ожидает EOF на STDIN перед выходом.

Очевидно, что это приводит к зависанию сценария во время ожидания дочернего элементапроцесс до конца.

У меня есть идентификатор процесса дочернего процесса, но нет канала или какого-либо дескриптора к нему.Как я могу открыть дескриптор STDIN процесса, чтобы отправить ему EOF?

1 Ответ

8 голосов
/ 17 ноября 2010

РЕДАКТИРОВАТЬ: Учитывая, что вы не запускаете сценарий, решение, которое мне приходит в голову, это поставить $ stdin под ваш контроль при использовании вашего драгоценного камня. Я предлагаю что-то вроде:

old_stdin = $stdin.dup
# note that old_stdin.fileno is non-0.
# create a file handle you can use to signal EOF
new_stdin = File::open('/dev/null', 'r')
# and make $stdin use it, instead.
$stdin.reopen(new_stdin)
new_stdin.close
# note that $stdin.fileno is still 0, though now it's using /dev/null for input.
# replace with the call that runs the external program
system('/bin/cat')
# "cat" will now exit.  restore the old state.
$stdin.reopen(old_stdin)
old_stdin.close

Если ваш скрипт ruby ​​создает задачи, он может использовать IO::popen. Например, cat при запуске без аргументов будет ожидать EOF в stdin до его выхода, но вы можете выполнить следующее:

f = IO::popen('cat', 'w')
f.puts('hello')
# signals EOF to "cat"
f.close

...