2017-10-30 5 views
0

Tclのサブプロセスmoreに書き込もうとすると、broken pipeエラーが発生します。 moreが異常終了したようです。例:Tclのページャサブプロセスに書き込む方法は?

#!/usr/bin/env tclsh 

set pager [open {| more} w] 

for {set i 0} {$i < 10000} {incr i} { 
    puts $pager "$i foo" 
} 

close $pager 

何が問題なのか分からない。

moreの代わりにlessを使用しても問題ありません。


編集:次のPythonのバージョンが正常に動作します。

#!/usr/bin/env python3 

import os 

pager = os.popen("more", "w") 

for i in range(10000): 
    pager.write("{} foo".format(i)) 

pager.close() 

答えて

0

問題は、あなたがパイプを閉じたとき、moreプロセスが終了しますSIGPIPE信号を取得することで、Tclがあったことを検出します信号による出口があり、そのエラーが発生します。

これを処理する最も簡単な方法は、closeの周りにcatchを置くことです。

#!/usr/bin/env tclsh 

set pager [open {| more} w] 

for {set i 0} {$i < 10000} {incr i} { 
    puts $pager "$i foo" 
} 

catch {close $pager} 

あるいは、less代わりにmore使用。入力パイプの終わりで同じ方法で終了しません(デフォルトで)。

+0

これをPythonでやってみたところ、正しく動作していたので、もっとTclの問題だと思います。 (そのPythonコードで質問を更新しました) –

関連する問題