2012年6月21日

[ruby-list:48803] Re: setsid(2) とgetsid(2)

さとうふみやす @ OSSTech です。

小崎さん、田中さん、ありがとうございました。
Ruby と関係ない話でしたね。すみません…。まとめです。

* setsid(2) は既にプロセスグループリーダーの場合は
失敗して -1 を返し errno が EPERM になる。
* ジョブコントロールをサポートしたシェルから起動する

コマンドは、新たなプロセスグループ上で実行される。
* よってシェルから `ruby -e "Process.setsid"` を実行すると
これに該当して setsid(2) が失敗して Errno::EPERM になる。

At Wed, 20 Jun 2012 20:38:10 +0900,
SATOH Fumiyasu wrote:
> Ruby で Process.setsid (setsid(2)) が失敗します。
>
> $ uname -a
> Linux sugar 3.2.0-2-amd64 #1 SMP Mon Jun 11 17:24:18 UTC 2012 x86_64 GNU/Linux
>
> ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]
> -e:1: undefined method `getsid' for Process:Module (NoMethodError)
>
> $ ruby1.9.1 -e "Process.setsid"
> ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
> -e:1:in `<main>': undefined method `getsid' for Process:Module (NoMethodError)

あれ、実行例が間違えてました。

$ ruby1.9.1 -ve "Process.setsid"
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
-e:1:in `setsid': Operation not permitted (Errno::EPERM)

> Perl や setsid(1) では問題ありません。
>
> $ perl -e 'use POSIX; POSIX::setsid || die "$!"'

Perl の POSIX::setsid は setsid(2) と同じく失敗した場合は -1 を
返すので以下が正しいコードで、Ruby と同様に失敗する。

$ perl -e 'use POSIX; POSIX::setsid==-1 and die "$!"'
許可されていない操作です at -e line 1.

> $ setsid true

util-linux の setsid(1) は既にプロセスグループリーダーのときは
fork(2) してるためその後の setsid(2) は失敗しない。

At Thu, 21 Jun 2012 05:10:12 +0900,
KOSAKI Motohiro wrote:
> > setsid(2) によると、EPERM になるのは呼び出したプロセスが既に
> > プロセスリーダーの場合、と記載されています。それを確かめたくて
> > Ruby で getsid(2) 相当で確認しようと思ったのですが、Process.getsid
> > はないようです。需要がないからでしょうか?
>
> 理由は知りませんが、チケット切ってくれるならあとで追加するのに
> やぶさかではないです

時間がとれたらやりたいと思います。

--
-- Name: SATOH Fumiyasu (fumiyas @ osstech co jp)
-- Business Home: http://www.OSSTech.co.jp/
-- GitHub Home: https://GitHub.com/fumiyas/


投稿者 xml-rpc : 2012年6月21日 11:46
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/111025
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。