Я пытаюсь понять IO.popen, когда его команда "-"
запускает новый интерпретатор Ruby.
В этом вопросе мало материала, и я медленно прохожу через них, главным образом из-за меня, поскольку я только код для удовольствия.
Насколько я понял, когда вызывается IO.popen("-", "w+") {|f| ...}
- что с блоком - этот блок будет выполняться как родительским, так и дочерним процессом. Разница в том, что родительский процесс получит объект IO в результате, но ребенок получает только Nil. Это легко, мне нужно проверить |f|
в блоке, а когда это Nil, выполнение выполняется в дочернем процессе, когда оно не равно nil, выполнение выполняется в родительском. Поэтому мне нужно написать оба кода для родителя и дочернего элемента, разделенных символом if
.
На этот раз это помогает мне понять проблему, что блок является частью команды IO.popen.
У меня есть этот код:
pipe = IO.popen("-","w+")
# puts "This line will break functionality if uncommented"
if pipe != nil then
pipe.puts "PID: #{Process.pid}"
$stderr.puts "Parent from child: #{pipe.gets.chomp}"
else
$stderr.puts "Child PID: #{Process.pid} and Parent #{gets.chomp}"
puts "M'kay"
end
Вопросы:
- Что решает, какой процесс выполняется первым? Если они должны были добавить файл, он будет уязвим для условий гонки?
- Почему вторая строка нарушает код? Команда
pipe = IO.popen...
не должна быть связана с блокомif..else..end
, но они есть. Для меняpipe
- это дескриптор файла (как в старой Turbo Pascal), который сначала где-то где-то где-то где-то помечен, а затем обрабатывается в другом месте.