ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

IPC Namespaceをまたいだプロセス間で、pipeでやりとりする。mrubyで。

Introduction to Linux namespaces - Part 2: IPC | Yet another enthusiast blog!

こういうブログ記事があって、元記事はC言語なんだけど、これと同じことをmrubyでもやってみたサンプル。なお元記事は clone(2) だけど今回はforkしてから unshare(2) している。clone未実装なんで。。

reader, writer = IO.pipe
puts " - Hello ?"

p = Process.fork do
  Namespace.unshare(Namespace::CLONE_NEWUTS | Namespace::CLONE_NEWIPC)

  writer.close
  reader.read # blocking

  system "hostname 'In-Namespace'"
  puts " - World !"
  Exec.exec "/bin/bash"
end

10.times do
  sleep 0.5
  print "."
end
puts
writer.close

Process.waitpid p

(build_configはこんな感じで)

MRuby::Build.new do |conf|
  toolchain :gcc
  conf.gembox 'full-core'
  conf.gem github: 'haconiwa/mruby-exec'
  conf.gem github: 'iij/mruby-process'
  conf.gem github: 'iij/mruby-io'
  conf.gem github: 'haconiwa/mruby-namespace'
end

めちゃくちゃハマっていたのは、forkするんでwriter FDが親子プロセスともにコピーされるため、両方クローズしないとreadでブロックし続けるよね...というところ...。

[vagrant@localhost vagrant]$ sudo ./mruby/bin/mruby sample/ipc_ns.rb 
 - Hello ?
..........
 - World !
[root@In-Namespace vagrant]# 

unshare(Namespace::CLONE_NEWIPC) は成功しているが、プロセス間でやりとりをやっていけているようだ。 (mruby はこういう挙動をサクッと試せて便利)


Linuxプログラミングインタフェース

Linuxプログラミングインタフェース

とにかくこれを読まないとダメな気がする、このままでは俺はダメになる気がするこの頃。