Spec-Zone.ru › Ruby 3.3

модуль Signal

Многие операционные системы позволяют отправлять сигналы запущенным процессам. Некоторые сигналы имеют определённое воздействие на процесс, в то время как другие могут быть перехвачены на уровне кода и обработаны. Например, ваш процесс может перехватывать сигнал USR1 и использовать его для переключения отладки, а TERM может использоваться для инициирования контролируемого завершения.

pid = fork do
  Signal.trap("USR1") do
    $debug = !$debug
    puts "Debug now: #$debug"
  end
  Signal.trap("TERM") do
    puts "Terminating..."
    shutdown()
  end
  # . . . do some work . . .
end

Process.detach(pid)

# Controlling program:
Process.kill("USR1", pid)
# ...
Process.kill("USR1", pid)
# ...
Process.kill("TERM", pid)

приводит к:

Debug now: true
Debug now: false
Terminating...

Список доступных имён сигналов и их интерпретации зависит от системы. Signal семантика доставки также может различаться между системами; в частности, доставка сигналов не всегда может быть надёжной.

Методы публичного класса

list → a_hash Показать исходный код
static VALUE
sig_list(VALUE _)
{
    VALUE h = rb_hash_new();
    const struct signals *sigs;

    FOREACH_SIGNAL(sigs, 0) {
        rb_hash_aset(h, rb_fstring_cstr(sigs->signm), INT2FIX(sigs->signo));
    }
    return h;
}

Возвращает список имён сигналов, сопоставленных с соответствующими базовыми номерами сигналов.

Signal.list   #=> {"EXIT"=>0, "HUP"=>1, "INT"=>2, "QUIT"=>3, "ILL"=>4, "TRAP"=>5, "IOT"=>6, "ABRT"=>6, "FPE"=>8, "KILL"=>9, "BUS"=>7, "SEGV"=>11, "SYS"=>31, "PIPE"=>13, "ALRM"=>14, "TERM"=>15, "URG"=>23, "STOP"=>19, "TSTP"=>20, "CONT"=>18, "CHLD"=>17, "CLD"=>17, "TTIN"=>21, "TTOU"=>22, "IO"=>29, "XCPU"=>24, "XFSZ"=>25, "VTALRM"=>26, "PROF"=>27, "WINCH"=>28, "USR1"=>10, "USR2"=>12, "PWR"=>30, "POLL"=>29}
signame(signo) → строка или nil Показать исходный код
static VALUE
sig_signame(VALUE recv, VALUE signo)
{
    const char *signame = signo2signm(NUM2INT(signo));
    if (!signame) return Qnil;
    return rb_str_new_cstr(signame);
}

Преобразует номер сигнала в имя сигнала. Возвращает nil если signo — некорректный номер сигнала.

Signal.trap("INT") { |signo| puts Signal.signame(signo) }
Process.kill("INT", 0)

приводит к:

INT
trap( сигнал, команда ) → обьект Показать исходный код
trap( сигнал ) {| | блок } → обьект
static VALUE
sig_trap(int argc, VALUE *argv, VALUE _)
{
    int sig;
    sighandler_t func;
    VALUE cmd;

    rb_check_arity(argc, 1, 2);

    sig = trap_signm(argv[0]);
    if (reserved_signal_p(sig)) {
        const char *name = signo2signm(sig);
        if (name)
            rb_raise(rb_eArgError, "can't trap reserved signal: SIG%s", name);
        else
            rb_raise(rb_eArgError, "can't trap reserved signal: %d", sig);
    }

    if (argc == 1) {
        cmd = rb_block_proc();
        func = sighandler;
    }
    else {
        cmd = argv[1];
        func = trap_handler(&cmd, sig);
    }

    if (rb_obj_is_proc(cmd) &&
        !rb_ractor_main_p() && !rb_ractor_shareable_p(cmd)) {
        cmd = rb_proc_isolate(cmd);
    }

    return trap(sig, func, cmd);
}

Определяет обработку сигналов. Первый параметр — имя сигнала (строка, такая как «SIGALRM», «SIGUSR1» и так далее) или номер сигнала. Символы «SIG» могут быть опущены из имени сигнала. Команда или блок определяют код, который будет выполняться при поднятии сигнала. Если команда — строка «IGNORE» или «SIG_IGN», сигнал будет игнорироваться. Если команда — «DEFAULT» или «SIG_DFL», будет вызван обработчик по умолчанию Ruby. Если команда — «EXIT», сценарий будет завершён сигналом. Если команда — «SYSTEM_DEFAULT», будет вызван обработчик по умолчанию операционной системы. В противном случае будет выполнена заданная команда или блок. Специальное имя сигнала «EXIT» или номер сигнала ноль будут вызваны непосредственно перед завершением программы. trap возвращает предыдущий обработчик для данного сигнала.

Signal.trap(0, proc { puts "Terminating: #{$$}" })
Signal.trap("CLD")  { puts "Child died" }
fork && Process.wait

приводит к:

Terminating: 27461
Child died
Terminating: 27460

Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API