Ruby Pipe и расширения C - PullRequest
       0

Ruby Pipe и расширения C

0 голосов
/ 28 апреля 2011

У меня есть какой-то рубиновый код (1.9), например

@rd,@wd = IO.pipe

def callback()
  puts @wd.class
  # do stuff
end

pid = fork do
  @rd.close
  register_callback(:callback)
end

@wd.close
# do some stuff in parent process

register_callback - это расширение C, которое выполняет системный вызов блокировки и при определенных условиях вызывает функцию ruby, связанную с переданным символом.

Однако @wd относится к типу NilClass в соответствии с сообщением, которое я получаю при запуске этой программы, и она пытается получить доступ к @wd в функции обратного вызова, что для меня не имеет никакого смысла. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 28 апреля 2011

после вызова метода register_callback.Остальная часть кода продолжает выполняться (как вы делаете вызов метода register_callback внутри fork).Итак, @ wd.close запускается до того, как ваш обратный вызов сделан.Следовательно, когда наконец вызывается метод callback ().@wd равно nil (что является результатом @wd.close).

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