2016-11-10 19 views
2

私はSIGINTを捕まえる方法を知っていますが、私は自分のコードにブロックをどこかにランダムに入れる方法しか知りません。私はSIGINTを捕まえることができる必要があります。なぜなら、ファイルの書き込みが進行中(私のデータベースが頻繁にファイルに書き込む)、ファイルを破壊するからです。これを処理する理想的な方法は何ですか?Ruby - ファイル書き込みの終了を許可するSIGINT

は編集

一例では、私はSIGINTを検出した場合、私の書き込み機能を実行することで、これを取り扱うが、私はへの書き込みの途中で文字通りだ場合、私は助けにはなりませんこれを実現していますマーシャルを使用するファイル。

RubyにSIGINTをキャッチして、それが無視されるようにする方法はありませんか?

だけの可能な答えを考え出した2

ネヴァーマインド編集、...以下を参照してください。

+0

あなたは[ 'Signal'](httpsでそれをキャッチしようとしたことがあり/ruby-doc.org/core-2.3.1/Signal.html)?これを使用してシャットダウンフラグをトリガーします。 – tadman

+0

私は過去に 'trap'を使っていましたが、ちょっと読んだだけです - あなたは割り込みを救うことについて話していますか?私がそれをした場合、ファイル書き込み部分の周りにレスキューステートメントを置くだけですか? – Max

+0

例外を生成する前に信号をインターセプトする必要があります。 – tadman

答えて

0

レスキューブロックを使用して終了しました。レスキューブロックは、Interruptを救いました。このブロックでは、ブール値をtrueにします。 booleanは各スレッドプールタスクの開始時にチェックされ、trueの場合は関数全体をスキップします。私のオリジナルのポストで私の編集に関しては

編集

:ファイルの書き込みで割り込みを処理するための最良の方法は、再びブール値を使用するだろうか?たとえば、interruptと呼ばれるブール値を作成し、ファイルの書き込みの最後にブール値が真であるかどうかを確認し、ブール値が真ならばプログラムを中止しますか?私は救助員を使って割り込みを捕まえることができませんでしたが、私はトラップを使うことができましたか?私はどうなるのかだ

0

Signal.trap("INT"){ 
    if $lock 
    puts "Not yet done. Please don't interrupt" 
    else 
    puts "Goodbye!" 
    exit 
    end 
} 

def something_long_that_shouldnt_be_interrupted 
    $lock = true 
    10.times do |i| 
    puts "Writing #{i+1}/10. Don't interrupt" 
    sleep 1 
    end 
    $lock = false 
end 

def some_other_process_that_can_be_interrupted 
    10.times do |i| 
    puts "Unimportant stuff #{i+1}/10." 
    sleep 1 
    end 
end 

something_long_that_shouldnt_be_interrupted 
some_other_process_that_can_be_interrupted 


# Writing 1/10. Don't interrupt 
# Writing 2/10. Don't interrupt 
# ^CNot yet done. Please don't interrupt 
# Writing 3/10. Don't interrupt 
# Writing 4/10. Don't interrupt 
# ^CNot yet done. Please don't interrupt 
# Writing 5/10. Don't interrupt 
# ^CNot yet done. Please don't interrupt 
# ^CNot yet done. Please don't interrupt 
# Writing 6/10. Don't interrupt 
# ^CNot yet done. Please don't interrupt 
# Writing 7/10. Don't interrupt 
# Writing 8/10. Don't interrupt 
# ^CNot yet done. Please don't interrupt 
# Writing 9/10. Don't interrupt 
# Writing 10/10. Don't interrupt 
# Unimportant stuff 1/10. 
# Unimportant stuff 2/10. 
# Unimportant stuff 3/10. 
# Unimportant stuff 4/10. 
# ^CGoodbye! 

何度もそれ以上を使用する場合は、あなたが定義することができ:/:

def do_not_disturb(&block) 
    $lock = true 
    block.yield 
    $lock = false 
end 

do_not_disturb do 
    # code that shouldn't be interrupted 
end 
関連する問題