2

Ruby プロセスと Python プロセスの間で何らかの通信を行おうとしています。UNIXソケットを使いたい。

目的: Ruby プロセスは Python プロセスを「フォークして実行」します。Ruby プロセスで UNIX ソケット ペアを作成し、Python に渡します。

Ruby コード ( p.rb ):

require 'socket'

r_socket, p_socket = Socket.pair(:UNIX, :DGRAM, 0)

# I was hoping this file descriptor would be available in the child process
pid = Process.spawn('python', 'p.py', p_socket.fileno.to_s)

Process.waitpid(pid)

Python コード ( p.py ):

import sys
import os
import socket

# get the file descriptor from command line
p_fd = int(sys.argv[1])

socket.fromfd(p_fd, socket.AF_UNIX, socket.SOCK_DGRAM)

# f_socket = os.fdopen(p_fd)
# os.write(p_fd, 'h')

コマンドライン:

ruby p.rb

結果:

OSError: [Errno 9] Bad file descriptor

Ruby プロセスがファイル記述子を Python プロセスに渡し、これら 2 つがこれらのソケットを使用してデータを送信できるようになることを期待していました。

だから、私の質問:

1) 上記のように、Ruby と Python のプロセス間でオープン ファイル記述子を渡すことは可能ですか?

2) 2 つのプロセス間でファイル記述子を渡すことができる場合、コードのどこが間違っているのでしょうか。

4

1 に答える 1

5

あなたは閉じていましたが、引数として渡さない限り、Rubyspawnはデフォルトで2を超えるファイル記述子を閉じます。:close_others => falseドキュメントを参照してください:

http://apidock.com/ruby/Kernel/spawn

実例:

require 'socket'

r_socket, p_socket = Socket.pair(:UNIX, :DGRAM, 0)

pid = Process.spawn('python', 'p.py', p_socket.fileno.to_s,
                    { :close_others => false })

# Close the python end (we're not using it on the Ruby side)
p_socket.close

# Wait for some data
puts r_socket.gets

# Wait for finish
Process.waitpid(pid)

Python:

import sys
import socket

p_fd     = int(sys.argv[1])
p_socket = socket.fromfd(p_fd, socket.AF_UNIX, socket.SOCK_DGRAM)

p_socket.send("Hello world\n")

テスト:

> ruby p.rb
Hello world
于 2013-01-31T15:40:49.133 に答える