拡張ライブラリの作り方はこんな感じでいいでしょうか?

■ お題

デーモンを作りたくて、コントロールターミナルを切ろうと
思ったのですが、使っている HP-UX の事情でちょっと困っ
ています(Linux なら困らないのですけど)。

HP-UX は、BSD 互換の setpgrp2(2) と System V 互換の 
setpgrp(2) の二つを持っています。Ruby の configure は、
BSD 互換の setpgrp2(2) をみつけてしまうので(手で修正す
るのも方法ですが)、setpgrp2(2) を使ってしまいます。

BSD ならこのときは、ioctl(2) で TIOCNOTTY するのですが、
HP-UX では動作しません。

ということで、POSIX が使えるので、setsid(2) を使い
setpgrp(2) のこの問題を回避してみました。

# 個人で使う場合はこれでいいのですが...

■ POSIX の setsid(2) だけ

一応動いているようですが。エラー処理とか、こんな感じでい
いでしょうか?

------------------------------
#include <unistd.h>
#include "ruby.h"

static VALUE
POSIX_setsid()
{
  int ret;
  ret = setsid();

  if (ret == -1) {
    Fail("POSIX setsid(2) failed");
  }

  return INT2FIX(ret);
}

void
Init_POSIX()
{
  VALUE mPOSIX = rb_define_module("POSIX");

  rb_define_module_function(mPOSIX, "setsid", POSIX_setsid, 0);
}
------------------------------

■ お試し用スクリプト

------------------------------
require "POSIX"

exit if fork

POSIX.setsid

sleep 10

exit
------------------------------

二度 POSIX.setsid を実行すると、エラーを確認できます。

■ 余談

かなり拡張ライブラリを作るのが楽になっていますね。この
他にもテスト的に kconv があるのに ack(漢字変換コンバー
タ) を組み込んでみたりしたのですが、ちょっとしたことを
試すのにもすごくいいです。

--
WATANABE Tetsuya HP Japan PSO
e-mail  tetsu / jpn.hp.com