2017-01-16 4 views
1

Что я в настоящее время:Как я могу восстановить SIGINT?

trap "SIGINT" do 
    case ENV["MODE"] 
    when "A" 
    ... 
    when "B" 
    ... 
    end 
end 

Если бы я хотел не иметь ловушку, если ENV["MODE"] не был установлен, я хотел бы сделать:

trap "SIGINT" do 
    case 
    ... 
    end 
end if ENV["MODE"] 

Но что, если я хочу передать ловушку на конкретный стоимость?

trap "SIGINT" do 
    case ENV["MODE"] 
    when "A" 
    ... 
    when "B" 
    ... 
    when "C" 
    # here I want to really do a SIGINT 
    else 
    # or here 
    end 
end 
+0

Что такое ожидаемое поведение? –

+0

Почему бы просто не заменить 'if ENV ['MODE']' с 'if ['A', 'B']. Включить ENV ['MODE']'? Но чтобы ответить на ваш вопрос - 'Process.kill ('INT', Process.pid)'. – ndn

+0

@ EricDulusil, чтобы работать подобно вызову 'raise' из' rescue ... end'. – Nakilon

ответ

1

Пожалуйста

Пожалуйста, следуйте @ советы СРС, чтобы определить trap внутри case или if, а не наоборот.

не определенное trap

Примечание: Это просто доказательство концепции!

Вызов Process.kill('INT', Process.pid) внутри when "C" будет снова попадать в trap. Прежде всего вам необходимо определить trap. Из documentation:

Если команда является «DEFAULT» или «SIG_DFL» рубин в обработчик по умолчанию будет вызываться.

Вот пример:

trap "SIGINT" do 
    mode = %w(A B C D).sample 
    puts "Sigint with mode : #{mode}" 
    case mode 
    when "A" 
    puts "A, not exiting" 
    when "B" 
    puts "B, not exiting" 
    when "C" 
    puts "C, exiting" 
    trap "SIGINT", "DEFAULT" 
    Process.kill('INT', Process.pid) 
    else 
    puts "D, exiting" 
    trap "SIGINT", "DEFAULT" 
    Process.kill('INT', Process.pid) 
    end 
end 

while true 
    sleep 0.1 
    p "+1" 
end 

Он выводит:

"+1" 
"+1" 
"+1" 
^CSigint with mode : A 
A, not exiting 
"+1" 
"+1" 
"+1" 
"+1" 
"+1" 
"+1" 
^CSigint with mode : C 
C, exiting 
trap_sigint.rb:21:in `sleep': Interrupt 
    from trap_sigint.rb:21:in `<main>' 

Использование exit

Это не тот же самый сигнал, но если вы просто хотите, чтобы остановить выполнение ваш сценарий, когда режим «C» или «D», вы можете использовать exit вместо SIGINT:

trap "SIGINT" do 
    mode = %w(A B C D).sample 
    puts "Sigint with mode : #{mode}" 
    case mode 
    when "A" 
    puts "A, not exiting" 
    when "B" 
    puts "B, not exiting" 
    when "C" 
    puts "C, exiting" 
    exit 
    else 
    puts "D, exiting" 
    exit 
    end 
end 

while true 
    sleep 0.1 
    p "+1" 
end 

Он выводит

"+1" 
"+1" 
^CSigint with mode : A 
A, not exiting 
"+1" 
"+1" 
"+1" 
"+1" 
^CSigint with mode : B 
B, not exiting 
"+1" 
"+1" 
"+1" 
"+1" 
^CSigint with mode : D 
D, exiting 
Смежные вопросы