によってコンパイル、実行できるもので、 pty を介して子プロセスから親プロセスにデータを渡し、 親プロセスがそれを表示する単純なものです。cc pty_bug.c ; ./a.out(MacOSX の場合)
cc pty_bug.c -lutil ; ./a.out(NetBSD の場合)
MacOSX 10.2 では直っていない模様です。
その後回避方法を探していろいろ調べたところ、次のことが分かりました。
ttylclose() -> ttywflush() -> ttywait() -> ttysleep() -> tsleep()という呼び出し連鎖のもとで行われる。
MacOSX はカーネル内部でスレッドへの対応を行っているので、 私にとっては、 _exit() ひとつとってももかなりややこしい道筋をたどらないと動作が追えないと感じました。 上記記述についても、あまり自信がありません。
というわけで、回避方法は何通りか考えられるのですが、 とりあえずカーネルに手を入れてみることにしました。 現時点での最新のカーネルを CVS で獲得し、 こういった変更を行い、 コンパイルして (MacOSX 10.2 で) 使ってみています。 bug_pty.c は期待どおりの動作をすることは確認しましたし、 Emacs 21.3.50 の M-x grep がうまく動かない件も直っていることを確認しました。 しかし、他に悪影響を及ぼす恐れが大いにあるので、 しばらく検証が必要かと思います。
[2003/10/26]Mac OS X 10.3 ではこのバグは修正されています。
[2004/1/27]
私よりはるか昔にこのバグを
Apple に report してた人がいました。
つまり直すのに1年半以上。
ちなみに NetBSD-current でもちょっと前に似たような問題が起こってました。
すぐに修正されましたが。