[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00955] Re: ツリーで移動中にSEGV
- Subject: [FDclone-users:00955] Re: ツリーで移動中にSEGV
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Wed, 14 Mar 2012 22:04:39 +0900
しらいです。
In Message-Id <20120310184301.7301687C001@yuka.unixusers.net>
Takashi SHIRAI <shirai@unixusers.net>writes:
> しらいです。
> 確かに FD-3.00j の release 時には動いていたのですが、その
> 後の version up により、現在の最新版 1.7.11 では幾分支障があ
> るようです。
Cygwin の解析及びバグ対処が一通り終わったので、状況をまと
めておきます。説明の便宜上、症状に対して番号を割り振っておき
ます。
> 1.tcsetpgrp() が freeze する。
> 2.子 process に制御端末を渡せない。
この二つはそのまま 1. と 2. にします。
> まず escape sequence の受信速度が遅くなりました。特殊キー
> 押下時の \e[1~ みたいな文字列ですね。この各文字が送出されき
> るまでにかかる時間が 10 倍以上になってます。
これを 3-1. とします。
> あと、cursor 位置取得用の escape sequence が使えなくなりま
> した。正確には、取得しようとすると入力が block されてしまう
> ので使えません。
これは 3-2. とします。
> 出力の方も時折 block されるので、コマンドプロンプト以外の
> 端末を使う場合は適宜何かキー入力をして、出力を促してやる必要
> があります。
これは 3-3. とします。
Cygwin 1.7.11 で 3-1. と 3-3. が発症し、他は Cygwin 1.7.9
での発症です。また、3-1. と 3-2. は TERM 名称「cygwin」とな
る console でのみ再現し、3-3. はそれ以外の端末で再現します。
そして、そのどれもが Cygwin 側の実装ミスであることが判って
います。
1. と 2. は tcsetpgrp() を ioctl() の TIOCSPGRP request で
置換えられないというバグが原因でした。3-3. は逆に ioctl() の
TCFLSH request を tcflush() で置換えられないというバグです。
これらは置換え関数が存在するので、どちらも支障ない方の関数
に置換えることで対処済です。特に後者は POSIX 関数の方が使え
ないので、Cygwin 側でも真面目に修正すべき問題でしょう。
前者に関してその後判ったことですが、1.7.9 より前の Cygwin
で compile 済の fd.exe は正常動作します。<sys/termio.h> の中
で TCFLSH の値に記述ミスが混入したのかも知れませんね。
残る 3-1. と 3-2. ですが、これは端末「cygwin」に固有の問題
で、端末の実体はコマンドプロンプトで変わっていないので、TTY
driver 側の仕様変更やバグになります。
3-1. は実測でそうなっているというだけで理由も根拠も不明で
す。理論上の baud rate は変わっていないので、何か実装上の都
合だと思いますが、これは WAITKEYPAD の変更で対応します。
3-2. は select() の実装ミスで、「\[6n」のように応答を返す
筈の escape sequence 発行後に、実キー入力が起こるまで応答文
字列を受信出来なくなってしまいました。
pselect() や poll()/ppoll() も同様で、そうなると代替関数が
ありませんから、端末「cygwin」では「\[6n」発行後に入力の有無
を select() でチェックするのを回避することにしました。
あと細かい点では「\e[999;999H」という escape sequence の挙
動も変わりました。これは「cursor を座標 (998, 998) に移動」
という意味で、実際には画面最下段の右端に移動します。
これが Cygwin 1.7.9 移行の端末「cygwin」では、移動せずにそ
のままの cursor 位置に留まるので、画面サイズを識別出来なくな
りました。
コマンドプロンプトの仕様は MS-DOS に由来しているので、TTY
driver 側で escape sequence の変換が必要になりますが、その辺
りで仕様変更になったんでしょうかね。
MS-DOS の場合、この sequence の代わりに「\e[1;999H\e[999B」
という sequenceで「座標 (998, 1) に移動して 999 行下に移動」
することで初めて画面最下段の右端に移動します。
しかし、1.7.9 の端末「cygwin」では「\e[999B」も効かないの
で、999 回「\e[999B」を発行してようやく本来の目的を果たすこ
とが出来ました。
まぁ色々と勝手にいじってくれたようですが、どうも Cygwin の
開発陣にはそもそも利用者の顔が見えていないようなので、今後も
利用者側で何とかしていくしかないんでしょうね。
その辺り、流石は platform を同じくしている辺り、Microsoft
精神を忠実に受け継いでいると思います。
しらい たかし