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 はこういう挙動をサクッと試せて便利)
- 作者: Michael Kerrisk,千住治郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/12/01
- メディア: 大型本
- クリック: 14回
- この商品を含むブログ (7件) を見る
とにかくこれを読まないとダメな気がする、このままでは俺はダメになる気がするこの頃。