
[code]

    require 'thread'
    require 'time'
    require 'find'
    
    read, write = IO.pipe
    
    # 子プロセス処理
    fork do
      testArray = Array.new
      inArray = {
          :id                 => 1000,
          :type               => "A"
      }
      testArray << inArray
      testArray << inArray
    
      # 子プロセスで読み出さないのでクローズ
      read.close
      loop do
          str = Marshal.dump(testArray)
          write.puts str
    #      write.close
          sleep 5
      end
    
      write.close
    end
    
    # 親プロセス処理
    # 親から書き込まないのでクローズ
    write.close
    Thread.new do
      loop do
        read.read
        result = Marshal.load(message)
      end
    
    end
    
    # プロセス処理終了待ち
    Process.waitall
    
[/code]

forkを勉強中です。  
子プロセスから親プロセスにデータを渡したいと思っています。  
親側でIO.pipeを作成し、子でシリアライズしたデータを親に繰り返し送ろうとしています。  
繰り返し（loop do）処理がない場合、write.closeを子でおこなうことで  
親側で値を取得できました。  
繰り返し通知したい場合、「write.close」を行うと「write.puts」でエラーとなるため、  
「write.close」をコメントアウトすると、「read.read」ができない状態となったため、  
子プロセスの処理を

[code]

      read.close
      loop do
          str = Marshal.dump(testArray)
          write.puts str + 'end'★
          sleep 5
      end
    
[/code]

親プロセス処理を

[code]

      loop do
        read.read
        while message = read.gets('end')★
          message.delete('end')★
          results = Marshal.load(message)
        end
      end
    
[/code]

このようにしたところ、  
子からの書込み１回目は成功し、  
二回目は、以下まではくるももの、 Marshal.load以降が処理されません。  
message.delete('end')★

書込みや読み込みを繰り返し実施する場合、そもそもこのような作りではないのでしょうか？


CC BY-SA 4.0
2018-11-07T11:48:10.720
50061
2020-08-27T05:02:10.700
2018-11-07T12:02:14.743
3060
12842
question
ruby
Rubyで繰り返しプロセス間通信したい


puts を使っていますので、`read.gets("end\n", chomp: true)`
とすると良いのではないでしょうか。この場合、`message.delete('end')` は不要になります(蛇足ですが、`delete` ではなく
`message.slice!('end')` かと)。また、親プロセス側の `read.read` も不要かと思います。

シリアライズされたデータはバイナリですので、送信データの長さ(バイト長) + シリアライズデータの方が良いかと思います。

**コードのサンプル:**  
<https://paiza.io/projects/e/fV059c6YMuiay9wT7bxjwA>

* * *

_この投稿は[@metropolis
さんのコメント](https://ja.stackoverflow.com/questions/50061/ruby%e3%81%a7%e7%b9%b0%e3%82%8a%e8%bf%94%e3%81%97%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e9%96%93%e9%80%9a%e4%bf%a1%e3%81%97%e3%81%9f%e3%81%84#comment52215_50061)
の内容を元に コミュニティwiki として投稿しました。_


CC BY-SA 4.0
2020-08-27T05:02:10.700
69909
2020-08-27T05:02:10.700
3060
50061
answer