[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00993] Re: パイプ先を間違えることができない?



 しらいです。

 むむー。今月中に FD-3.01 を出すのは無理そうですね。

In Message-Id <op.wg9e0tkuc4zqer@pc02>
        "Hironao Komatsu" <hirkmt@gmail.com>さんwrites:
> 小松です。

> パイプ処理は頻繁にやることですが、パイプ先の名前を間違うと数回に
> 一度の割合で固まります。たとえばlessのつもりでlesと打ってしまう
> とか:

 ちょっと体調を崩して寝込んでますので、今日のところは、結論
に至る前の中間報告という形でご了承下さい。


> hironao@cynthia:~/FD-3.00l% ./fdsh
> hironao@cynthia:FD-3.00l$ ls -l | les
> les: command not found
> hironao@cynthia:FD-3.00l$ ls -l | les
> les: command not found
> hironao@cynthia:FD-3.00l$ ls -l | les
> les: command not found
> hironao@cynthia:FD-3.00l$ ls -l | les
> les: command not found

 まずこの症状ですが、再現する環境と再現しない環境とがあるよ
うです。少なくとも私の周辺では Linux 以外では再現していませ
ん。小松さんの環境は何でしょうか?
 再現する環境では「make sh」で作成した fdsh でも再現します。
こちらの方が構成がシンプルなので、検証にはこちらを用いた方が
楽だと思います。
 ただ、fd を fdsh という名称で起動したケースと区別しづらい
ので、「make sh」で作った方は便宜上 makesh と呼びます。


> 無限ループに入ったプロセスにシグナルを食わせてcoreを吐かせます。

 これは、Xtcsetattr() が errno=EINTR を無視して tcsetattr()
を呼び続けているだけのことで、無限ループしていること自体がお
かしい訳ではなさそうです。
 試しに該当箇所の Xtcsetattr() を素の tcsetattr() に書換え
てみると、誰かが SIGSTOP を発行していることに気づくと思いま
す。
 makesh で試すと、こっちは fdsh のような面倒な端末制御をし
ていないために、shell_loop() まで制御が戻って次のコマンド入
力を読込もうとして read() が SIGSTOP で止まります。
 では誰が SIGSTOP を発行しているのでしょう?FDclone はそん
なことしていないので kernel でしょう。SIGTTIN/SIGTTOU ならま
だしも何故に SIGSTOP が?

 因みに、「make bsh」で作成される fdbsh では再現しません。
fdsh +m として job control を無効にして起動した場合も再現し
ません。これは makesh でも同様でした。
 コマンドを端末からではなくファイルから入力した場合も再現し
ません。引数で渡しても標準入力にリダイレクトしても再現しませ
ん。端末から手入力した場合のみ再現します。
 となるとこれは端末制御の問題かも知れませんね。


 ということで、全然解決には至っていませんが、一個だけ adhoc
な対処法を見つけてあります。ま、この手のタイミングの問題では
よくやる手口ではありますけど。
 今回のトリガは pipe の最終段がエラーにより予想以上に早く終
了してしまった点にあるので、その処理に sleep を掛けて終わる
のを待たせればトリガ自体が解消されます。
 system.c の exec_process() に下記コメントが書かれた if 文
があります。この中で usleep() してみて下さい。引数はμsec な
ので 10000〜100000 くらいで十分です。
/* bash does not treat the end of pipeline as sub shell */

 コメントの内容のとおり、bash は pipe の最終段を fork しま
せんが、Bourne shell は fork するので FDclone はそれに倣って
います。
 ここを bash スタイルにすることでも今回の症状は回避されるの
ですが、FDclone は飽くまでも Bourne shell 互換を謳ってるので、
BASHSTYLE を定義しない限りは fork するのが仕様になります。

 まぁ、根本原因は後日時間を作って調査しますので、今日はこの
辺で終わらせて下さい。

                                               しらい たかし