1

マシンで長い Ruby スクリプトを実行していますが、それを小さな関数に分割し、ソケットをパラメーターとして送信することで再編成することを考えました。

#!/usr/bin/env ruby
def prepare data, my_socket
  # some calculations 
  my_socket.write data
end

# execution starts here 

tcpsocket = TCPSocket.open host, port
data = "xxx"
prepare(data, tcpsocket)

残念ながらテストできません。

編集:私はそれをすべきではないことを理解したので(後でこの件について読みます)、これが私がしたことです:

#!/usr/bin/env ruby
def prepare data
  my_array = []
  # some calculations 
  my_array << data
end

# execution starts here 

tcpsocket = TCPSocket.open host, port
data = "xxx"
my_array = prepare data
my_array.each do |m|
  my_socket.write m
end
4

1 に答える 1

1

tcpsocket指定されたソケットエンドポイントのローカル識別子 (ファイル記述子) です。

あるホストのファイル記述子を別のホストに送信しても、何も達成できません。ファイル記述子をホストするカーネル (またはプロセス) がなければtcpsocket意味がありません。通常、カーネルにはファイル記述子とソケット構造のマッピングがあります。ファイル記述子を反対側に送信するtcpsocketと、反対側には対応するソケット構造がありません。

したがって、渡されたファイル記述子に対する操作は、不適切なファイル記述子エラーで失敗します。最悪の場合、リモート ホスト上のプロセスが同じ値を持つ別のファイル記述子を持っていると、予期しない事態が発生します。

于 2013-09-17T23:37:35.000 に答える