Странное поведение killall
Приветствую уважаемых читателей!
;-)
Столкнулся с такой странностью при работе с сигналами в Линуксе.
Вот есть такая простенькая программка на C:
sigbug.c --
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
void handler (int sig_num)
{
printf ("Got signal %d\n", sig_num);
}
struct sigaction sa;
#define SETSIG(sig, fun, fla) sa.sa_handler = fun; \
sa.sa_flags = fla; \
sigaction(sig, &sa, NULL);
int main(void)
{
SETSIG(SIGTSTP, &handler, 0);
SETSIG(SIGCONT, &handler, 0);
while(1) {
sleep(5000);
}
}
sigbug.c --
То бишь она назначает обработчик сигналам SIGTSTP и SIGCONT и спит
себе, никого не трогая.
Компилируем её: gcc -o sigbug sigbug.c
и запускаем: ./sigbug
Открываем другую консоль и делаем:
# killall -s TSTP sigbug
Возвращаемя в нашу прогу - видим честное: Got signal 18.
В другой консольке пишем:
# killall -s CONT sigbug
Возвращаемся и ничего не понимаем: приложение отвалило в фон!
Как-будто нажали Ctrl-Z.
Ну ладно, пусть так. Возвращаем прилождение в активное состояние:
# fg
и опять уходим на вторую консоль, где говорим уже:
# killall -s 20 sigbug (20 - это как раз номер сигнала SIGCONT)
Возвращаемся на первую консоль и видим как и хотели: Got signal 20.
Мало того! Если в первой консоли при запущенном нашем приложении жать
Ctrl-Z, то будут вываливаться строки: Got signal 20.
Так вот, после такого затяжного вступления, ВНИМАНИЕ, ВОПРОС:
Что это за магия с killall? Почему сигнал в текствой форме попадает на
стандартный обработчик сигналов, а не как положено - на замещённый?
О себе (если это важно): Slackware Linux 9.0, ядро 2.4.20 (из
дистрибутива)
Sunday, August 31, 2003, 7:52:11 PM, you wrote:
....
компилирую один к одному - работает на ура (точнее: всегда в fg,
просто пишет номер (правильно))
Знаешь я использую RedHat 9 (kernel 2.4.22 www.kernel.org)
пишу
#kill -l
и получаю что
20 = SIGTSTP
18 = SIGCONT
Может в этом дело?
(А в чём же ещё)
Народ, откликайтесь, что выдаёт у вас kill -l ?