Отправляет email-рассылки с помощью сервиса Sendsay

Странное поведение 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 ?

Ответить   Vasile (#1446)

 

1 Сентябрь 2003 00:35, Vasile написал:

Думаю у всех одинаково :о) POSIX-разве на это не распространяется?

в ALTLinux Sisyphus:

20) SIGTSTP
18) SIGCONT

Ответить   Ilya (#1459)

 

Monday, September 1, 2003, 12:11:14 AM, you wrote:

Всё верно. Но что скажет Michael <michael***@m*****.ru>?
Вроде "Slackware Linux 9.0, ядро 2.4.20 (из дистрибутива)" с
совместимостью проблем не имеет.
Может вопрос в procps (содержит kill), или psmisc (killall)?

Ответить   Vasile (#1469)

 

Приветствую, Vasile,

Народы! Я дико извиняюсь, что ввёл вас в заблуждение с этими номерами
сигналов. Да, вы все правы, я написал их номера наоборот. Я писал по
памяти, просто перепутал, потому что это как бы не важно.

Вернее, тогда было не важно.
Сегодня я провел дополнителоьные исследования и выяснил, что заданным
мною вопрос несколько некорректен. А потому я щас его переформулирую
с учётом новых данных.

Номера сигналов у меня в точности такие, как писали вы. Да оно и не
может быть иначе! Но дочитав до конца вы поймете, что послужило
причиной этой моей ошибки.

Итак, сегодня я попробовал проделать все те же манипуляции с командой
kill.
На первом терминале я запустил ту же прогу - sigbug. На втором
терминале залогинился рутом и начал посылать всякие сигналы проге,
выяснив её PID при помощи # ps -ax | grep sigbug
Для удобства изложения допустим, что PID прожки оказался 242.
Итак:
терминал 2: # kill -s 18 242
терминал 1 - видим: Got signal 18
терминал 2: # kill -s 20 242
терминал 1 - видим: Got signal 20
терминал 2: # kill -s TSTP 242
терминал 1 - видим: Got signal 20
терминал 2: # kill -s CONT 242
терминал 1 - видим: Got signal 18
ВЫВОД: о чудо, всё работает! Мне даже стало неудобно, что в рассылку
писал. :)
Но я пошёл дальше, переключившись на killall:

терминал 2: # killall -s 18 sigbug
терминал 1 - видим: Got signal 18
терминал 2: # killall -s 20 sigbug
терминал 1 - видим: Got signal 20
терминал 2: # killall -s TSTP sigbug
терминал 1 - видим: Got signal 18 !? именно так, но ОТКУДА?????
терминал 2: # killall -s CONT sigbug
терминал 1 - видим: [242] Stopped.... {не помню, как выглядит; в фон ушло,
короче}.

Вот!
Т.е. налицо глюки killall и именно killall, а не kill.
Настораживает ещё и то, что kill -l и killall-l выводят РАЗНЫЕ списки
сигналов! В частности в списке killall -l TSTP идёт ПЕРЕД CONT!
Настораживает! Завтра попробую покопать её (killall) исходники, если
время будет.
Кто что по этому поводу сказать может? У кого какие результаты?