LINUX.ORG.RU

Помогите разобраться с сигналами


0

0

Пытаюсь посадить обработчик на USR1 После killall -USR1 my_prog получаю Power failure Что делаю не так?

#include <signal.h> #include <stdio.h>

void signalMessage(int sig) { printf("Catch signal\n"); }

int main(int argc, char *argv[]) { struct sigaction sa; int s= sizeof(sa); bzero(&sa,s);

sa.sa_handler = signalMessage;

sa.sa_flags = SA_NOMASK; sigaction(SIGUSR1, &sa, NULL); for(;;); exit(0); }

anonymous

info libc -> Signal Handling -> Defining Handlers -> Nonreentrancy сообщает нам, что из обработчиков сигналов нельзя вызывать функции оперирующие глобальными или статическими данными, к коим относится и printf (в этом случае глобальные данные представляются stdout'ом). Там же, в инфе есть пример того как это сделать по уму: info libc -> Signal Handling -> Defining Handlers -> Handler Return. Осталось научится пользоваться программой info.

LegaT
()

Попробовал немного модифицировать пример - получился тот же эффект. В чем я не прав?

#include <signal.h> #include <stdio.h> #include <stdlib.h>

/* This flag controls termination of the main loop. */ volatile sig_atomic_t keep_going = 1;

/* The signal handler just clears the flag and re-enables itself. */ void catch_alarm (int sig) { keep_going = 0; signal (sig, catch_alarm); }

void do_stuff (void) { puts ("Doing stuff while waiting for alarm...."); }

int main (void) { /* Establish a handler for SIGALRM signals. */ signal (SIGUSR1, catch_alarm);

/* Set an alarm to go off in a little while. */ // alarm (2);

/* Check the flag once in a while to see when to quit. */ while (keep_going) do_stuff ();

return EXIT_SUCCESS; }

anonymous
()

У меня стоит RH7.3. Промоделировал ситуацию - действительно есть такая фигня. "killall -v -USR1 my_prog" выдает: "Killed my_prog(8569) with signal 30", что не соответствует USR1 в signal.h. "kill -USR1 pid" - работает как надо. На счет 30 - могут появится некоторые соображения после изучения man 7 signal, обратите внимание на строчки: "SIGUSR1 30,10,16 A User-defined signal 1" и "SIGPWR 29,30,19 A Power failure (System V)".

Остается вопрос: откуда такая разница в трактовке USR1 у kill и killall? Может в том что для килл: "AUTHOR Taken from BSD 4.4. The ability to translate process names to process ids was added by Salvatore Valente <sva&#173; lente@mit.edu>.", а для киллолл: "AUTHORS Werner Almesberger <Werner.Almesberger@epfl.ch> wrote the original version of psmisc. Since version 20 Craig Small <csmall@small.dropbear.id.au> can be blamed."

LegaT
()

Спасибо за информацию У меня тоже RH 7.3

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.