Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell обработка сигналов / 9 сообщений из 9, страница 1 из 1
01.07.2005, 15:32:52
    #33145388
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell обработка сигналов
Привет!

Можно ли, обрабатывая сигнал в shell trap-ом
узнать id процесса, пославшего сигнал (типа как siginfo_t.si_pid при обработке sigaction) ???
...
Рейтинг: 0 / 0
01.07.2005, 15:55:45
    #33145463
v6y
v6y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell обработка сигналов
--null--Привет!

Можно ли, обрабатывая сигнал в shell trap-ом
узнать id процесса, пославшего сигнал (типа как siginfo_t.si_pid при обработке sigaction) ???
Да вроде нет, я по крайней мере в мане про то ничего не нашел... Или ты это так спросил - для поддержания разговора?
...
Рейтинг: 0 / 0
01.07.2005, 16:20:41
    #33145554
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell обработка сигналов
да нет, тут коллеге понадобилось
и что-то интересно стало - возможно ли такое в шелле...
В мане по трапу конечно ничего нет я думал может еще как-то.
Например, какая-нить переменная "процесс, от которого получен последний сигнал" или что-нить такое...

Вышли из ситуации пока так: кандидаты на подобное место - runnable процессы. Что конечно очень грубо и цинично.
...
Рейтинг: 0 / 0
01.07.2005, 18:48:55
    #33145913
v6y
v6y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell обработка сигналов
--null--
Вышли из ситуации пока так: кандидаты на подобное место - runnable процессы. Что конечно очень грубо и цинично.
Поясни плиз, если не трудно. Типа предполагается, что процесс у кого STATE есть R тот и послал сигнал что ли? Или где?
...
Рейтинг: 0 / 0
01.07.2005, 19:37:18
    #33145995
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell обработка сигналов
ага, это конечно наивняк, но тут мы предполагаем, что runnable процесс как раз и мог послать сигнал. Мне это тоже не очень нравится.
А чтобы было понятно, для чего эта шняга: аффтор хочет при получении сигнала чтобы скрипт отбросил мессагу на тот терминал, с которого поступил сигнал (т.е. реально PID нужен ему лишь для определения терминала).
...
Рейтинг: 0 / 0
01.07.2005, 20:33:55
    #33146053
v6y
v6y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell обработка сигналов
--null--ага, это конечно наивняк, но тут мы предполагаем, что runnable процесс как раз и мог послать сигнал. Мне это тоже не очень нравится.
А чтобы было понятно, для чего эта шняга: аффтор хочет при получении сигнала чтобы скрипт отбросил мессагу на тот терминал, с которого поступил сигнал (т.е. реально PID нужен ему лишь для определения терминала).

Аффтор жжет? (с)


Мне кажется если сигнал скрипту посылать kill-ом или killall-ом, то указанные команды завершатся раньше чем скрипт обработает вывод от ps... Или оно уже проверено и работает?
...
Рейтинг: 0 / 0
01.07.2005, 20:48:31
    #33146065
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell обработка сигналов
он грит что работает.
Проверю-ка я тоже, потому что насчет завершения согласен.
Это ж ps породить - достаточно долго.
Абыдна что в трапе такого не сделали и главное - тут уж никак shell не расширить, свой обработчик в него не внедрить (по крайней мере я не умею :-))
...
Рейтинг: 0 / 0
01.07.2005, 21:02:50
    #33146078
v6y
v6y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell обработка сигналов
--null--
он грит что работает.


Чего то мне интересно стало. Набросал щас небольшую прогу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
// sigtst.c
#include <signal.h>
#include <stdio.h>

#define SET0(str) str[sizeof(str)- 1 ]= 0 

void my_action(int sig, siginfo_t *si, void * p) {
 char path[ 1024 ];
 char lnk[ 1024 ];

 lnk[ 0 ]= 0 ; SET0(lnk); SET0(path);
 snprintf(path,sizeof(path)- 1 ,"/proc/%u/fd/0",si->si_pid);
 readlink(path,lnk,sizeof(lnk)- 1 );

 printf("Got signal %i from pid %i, term=%s (%s)\n",
  si->si_signo,si->si_pid,lnk, path);

 if (lnk[ 0 ]) {
  snprintf(path,sizeof(path)- 1 ,"echo Hello  > %s",lnk);
  system(path);
 } else perror("readlink");

 return;
}

main() {
 struct sigaction act;

 act.sa_flags=SA_SIGINFO;
 act.sa_sigaction=my_action;
 sigemptyset(&act.sa_mask);
 sigaction(SIGTERM,&act,NULL);

 while( 1 ) {sleep( 1 );}
}


Откомпилил, запутил. На другом терминале набрал killall sigtst... Вобщем почти всегда не успевает даже в этом случае (C + прямое сканирование /proc). Где то один раз из ста определяет терминал с которого послан сигнал. Разве что запустить killall -w sigtst - но это нечестно
...
Рейтинг: 0 / 0
01.07.2005, 21:19:33
    #33146090
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
shell обработка сигналов
да, лажа - собственно это и ожидалось.
Стало быть, тот скрипт пока что - профанация :-)
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / shell обработка сигналов / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]