Получение PID с помощью Ruby и FFI - PullRequest
1 голос
/ 11 ноября 2010

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

Итак, я установил необходимые пакеты (я на Ubuntu 10.10, поэтому я запустил sudo apt-get install libffi-*, который устанавливает помимо прочего libffi-ruby1.8 и libffi-dev), затем вставил пример, доступный здесь в irb1.8, который потерпел неудачу, как вы можете видеть ниже:

$ irb
irb(main):001:0> require 'ffi'
=> true
irb(main):002:0> 
irb(main):003:0* module GetPid
irb(main):004:1>   extend FFI::Library
irb(main):005:1> 
irb(main):006:1*   attach_function :getpid, [], :uint
irb(main):007:1> end
LoadError: no library specified
        from /usr/lib/ruby/1.8/ffi/library.rb:79:in `ffi_libraries'
        from /usr/lib/ruby/1.8/ffi/library.rb:106:in `attach_function'
        from (irb):6
        from /usr/lib/ruby/1.8/ffi/memorypointer.rb:33
irb(main):008:0>
irb(main):009:0* puts GetPid.getpid
NoMethodError: undefined method `getpid' for GetPid:Module
     from (irb):9
        from /usr/lib/ruby/1.8/ffi/memorypointer.rb:33
irb(main):010:0>

Кто-нибудь знает, что я делаю не так?

1 Ответ

3 голосов
/ 12 ноября 2010

Теперь вам нужно явно указать библиотеку, из которой вы хотите импортировать функции.

e.g. (untested, but should be close)

require 'ffi'
module LibC
  extend FFI::Library

  ffi_lib 'c'  # ** this line is now needed **

  attach_function :getpid, [], :uint
end

Более простые примеры приведены на https://github.com/ffi/ffi/wiki/Basic-Usage

Кстати, вы можете просто использовать Process.pid для получения pid текущего процесса или Process.ppid для получения pid его родителя - см. http://ruby -doc.org / core / classes / Process.html.

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