疑似端末 (pty) 関連のバグ


MacOSX 10.1.5 で pty を介した通信で データの末尾が消えてしまうというバグがあります。
たとえばこのプログラム(bug-pty.c)
cc pty_bug.c ; ./a.out (MacOSX の場合)
cc pty_bug.c -lutil ; ./a.out (NetBSD の場合)
によってコンパイル、実行できるもので、 pty を介して子プロセスから親プロセスにデータを渡し、 親プロセスがそれを表示する単純なものです。
NetBSD では期待通りの動作が見られます (test と表示されます) が、 MacOSX 10.1.5 で実行すると何も表示されません。
回避方法は見つけられませんでした (2002/7/4 現在)。
MacOSX 10.2 までに直っているかどうかもわかりません。
[2002/8/24]

MacOSX 10.2 では直っていない模様です。

その後回避方法を探していろいろ調べたところ、次のことが分かりました。

ということのようです。

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 でもちょっと前に似たような問題が起こってました。 すぐに修正されましたが。


nand@mac.com     目次へ $Revision: 1.9 $ $Date: 2004/02/04 17:54:35 $