2016-12-15 6 views
-2

LISPから呼び出されたコマンドは、バッファリングされたIOストリームに問題があります。私はこのような状況では役に立たないフラッシング機能しか見つけませんでした。IOバッファリングがオフになる

+0

詳細を追加できますか、どのようなコマンド、どのように呼び出されたか、どのようなトラブルがありますか? – cybevnm

+0

* "...この場合" *。どの状況ですか? – coredump

+0

正確なシェルコマンド – Seraph

答えて

5

あなたはそこオンとオフのバッファリングを有効にするには、noポータブルな方法がなく、非常に良い理由

ことはできません:バッファI/Oが速く桁違いです。

あなたはあなたが使用して実装でそれを行う方法を見つけることができるかもしれないが、それは時間の無駄になります

ことをやろうべきではない - あなたはすぐにそれが間違いだったことを実現します。自分の好意を持ち、私の歩みを振り返ってはいけません。私は約20年前にそれを試みました。

は良い方法あなたが書い行われ

、ちょうど flush the outputがあります。

これはクラスまたはマクロを使用してカプセル化することができるため、追加の入力は必要ありません。

それは多くの理由

のためのより良いです、私が提案するアプローチは、あなたのコードをより読みやすくなりますのでご注意ください - それは明示的にあなたのメッセージ境界を指定する必要があります。 覚えておいて、他の人(あなた自身から6ヶ月後)のコードを読んだり、変更したり、デバッグしたりすることができます。

+0

ありがとうございますが、シェルスクリプトのfuntion run-commandがコマンドからlispストリームにリダイレクトされたときに、コマンドが読み書きを実行するときを知りませんので、書き換えません。 – Seraph

+1

非常に特殊な状況です:_usually_シェルコマンド( 'ls'など)とlispシェルパイプは_line_バッファリングされています。これはあなたが望むものです。そうでない場合は、再現可能な例で*別の*質問をしてください。 – sds

+0

@Seraph "入力バッファリング"または "出力バッファリング"に問題がありますか?つまり、あなたがコマンドに書いたものがそれに送られなかったり( 'finish-output'と友人がここで助けてくれるはずですから)、またはspawnされたコマンドが何かを読んだままに読んでいるのですか?後者の場合は、パイプやlisp環境ではなく、おそらくコマンドでバッファリングされている可能性があります。 – Vatine

0

だから、私は最終的に見つかった問題(多分バグが??)

フォームは、この(SBCLのAPI)

(run-program "sudo" '("mv" "foo.txt" "/usr/bin") 
    :search t 
    :output t 
    :input t 
    :wait t) 

のように見えます。これは私が望んでいた正確にどのように動作しますが、問題は、その代わりにトンでした私は*standard-input**standard-output*を指定しました。これは、コマンドの適切な動作を引き起こしました(例えば、起動されたプログラムがsudoのようなユーザからの入力を希望した場合)。

理由は考えられませんが、少なくとも今は動作しています。

関連する問題