Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача аргументов в обработчик сигнала 
:(
    Опции темы
nullpoint
Дата 30.1.2015, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Добрый вечер. Подскажите возможно ли передать в обработчик сигнала дополнительные параметры? У меня есть два приложения. Из первого посылаю сигнал SIGTERM второму:
Код

kill(pid, SIGTERM);

Во втором приложении есть обработчик сигнала:
Код

void terminate_app(int sig)
{
    if (session->state == ONLINE)
        send_bye(session, thread_a, thread_b);
    
    close_session(session);
    exit(0);
}
 
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = terminate_app;
sigset_t   set; 
sigemptyset(&set);                                                             
sigaddset(&set, SIGTERM); 
act.sa_mask = set;
 
sigaction(SIGTERM, &act, 0);


Собственно в чем проблема. Чтобы закрыть сессию мне нужно в качестве аргументов передать в функцию send_bye имена потоков, чтобы корректно их завершить, структура session объявлена глобально. Пробовал так:
Код

if (session->state == ONLINE)
        send_bye(session, 0, 0);

Приложение завершается, но в первом приложении статус этого приложения остается ONLINE. При отладке в gdb приложении вываливается в segmentation fault на send_bye и затем нормально завершается.

Каким образом можно передать thread_a, thread_b в обработчик сигнала terminate_app? Объявить глобально не предлагать.
PM MAIL   Вверх
konshyn
Дата 30.1.2015, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(nullpoint @  30.1.2015,  15:17 Найти цитируемый пост)
Добрый вечер. Подскажите возможно ли передать в обработчик сигнала дополнительные параметры? У меня есть два приложения

Можно, но не стандартными сигналами, а сигналами "реального времени". Погугли, легко ищется.


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
xvr
Дата 30.1.2015, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(nullpoint @  30.1.2015,  15:17 Найти цитируемый пост)
структура session объявлена глобально. 

Надеюсь, что 'глобально' означает 'зашарена между процессами'? 

Цитата(nullpoint @  30.1.2015,  15:17 Найти цитируемый пост)
но в первом приложении статус этого приложения остается ONLINE.

Похоже не означает  smile 
PM MAIL   Вверх
nullpoint
Дата 30.1.2015, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Цитата(xvr @  30.1.2015,  15:54 Найти цитируемый пост)
Похоже не означает 

Конечно не означает. Это совершенно разные процессы, и первому совершенно не нужно знать о сессииях, потоках второго. Под "глобально" я имел в виду, глобально для второго приложения.

Использовать сигналы реального времени как мне кажется тоже не получится. Первое приложение просто отправляет сигнал "закройся" второму и он не знает какие потоки у него запущены. Мне нужно именно во втором приложении (которое принимает сигнал) передать в обработчик сигнала имена потоков, которые нужно закрыть перед завершением приложения.
PM MAIL   Вверх
konshyn
Дата 30.1.2015, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(nullpoint @  30.1.2015,  16:01 Найти цитируемый пост)
Использовать сигналы реального времени как мне кажется тоже не получится. Первое приложение просто отправляет сигнал "закройся" второму и он не знает какие потоки у него запущены. Мне нужно именно во втором приложении (которое принимает сигнал) передать в обработчик сигнала имена потоков, которые нужно закрыть перед завершением приложения. 

а в чем проблема?
из wiki
  •  можно послать несколько сигналов реального времени с гарантией доставки каждого
  •  с сигналом реального времени можно передать целочисленное значение или указатель
  •  гарантируется, что сигналы реального времени будут доставлены в той последовательности, в которой они были посланы

Определяешь структуру, в которой можешь хранить имена потоков (например список) и отправляешь через сигнал указатель на эту структуру. А в обработчике считываешь. 
И как это процесс не может знать, какие у него открыты потоки? Или я не совсем понял суть. 


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
nullpoint
Дата 30.1.2015, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Цитата(konshyn @  30.1.2015,  16:15 Найти цитируемый пост)
И как это процесс не может знать, какие у него открыты потоки? Или я не совсем понял суть.  

Сигнал отправляется из первого приложения, а закрывается второе приложение. Второе-то приложение конечно же знает какие у него потоки запущены, и в нем я могу в список записать их. Но как я могу из первого приложения передать указатель на этот список? Я пока еще не силен в программировании, но мне кажется это не возможно. Или я вас не понял?
PM MAIL   Вверх
konshyn
Дата 30.1.2015, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(nullpoint @  30.1.2015,  16:20 Найти цитируемый пост)
Или я вас не понял? 

Листайте на самый последний пункт



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
xvr
Дата 30.1.2015, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(nullpoint @  30.1.2015,  16:20 Найти цитируемый пост)
Но как я могу из первого приложения передать указатель на этот список?

А зачем? Закрывать то потоки вы все равно будете во 2м приложении, вот в нем и составляйте списки. 
Цитата(nullpoint @  30.1.2015,  16:01 Найти цитируемый пост)
Мне нужно именно во втором приложении (которое принимает сигнал) передать в обработчик сигнала имена потоков, которые нужно закрыть перед завершением приложения. 

Вызовите из обработчика функцию, которая вам вернет список потоков второго приложения, и закрывайте на здоровье  smile 

PM MAIL   Вверх
nullpoint
Дата 30.1.2015, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Цитата(konshyn @  30.1.2015,  16:27 Найти цитируемый пост)
Листайте на самый последний пункт

Скорее всего я не понимаю этого механизма, но попробую объяснить как я это вижу.
Итак, в первом приложении мы посылаемм сигнал с помощью:
Код

sigqueue(pid, signal, value)

здесь value - указатель на список потоков. Но сам список находится во втором приложении. И как же мы можем из первого приложения передать указатель на него вместе с сигналом? Первое приложение знать не знает в какой области памяти лежит этот список и что он вообще существует.



Цитата(xvr @  30.1.2015,  16:40 Найти цитируемый пост)
Вызовите из обработчика функцию, которая вам вернет список потоков второго приложения

А можно пример такой функции?

Вот есть у меня к примеру такой код:
Код

//как-то реализованный список
typedef struct {
    struct list_t* next;
    pthread_t value;
} list_t;

void pushlist(list_t **list, list_t *e)
{
    e->next = *list;
    *list = e;
}
....
//обработчик сигнала
void new_signal_handler(int sig)
{
    //тут мы должны вызвать функцию,
    //которая вернет нам список потоков

    if (session->state == ONLINE)
        send_bye(session, thread_a, thread_b);
    
    close_session(session);
    exit(0);
}

int main(void)
{
    list_t *list_thread;
    pthread_t pthread_a, pthread_b, pthread_c;
    struct sigaction act;
    memset(&act, 0, sizeof(act));
    act.sa_handler = new_signal_handler;
    sigset_t   set; 
    sigemptyset(&set);                                           
    sigaddset(&set, SIGTERM); 
    act.sa_mask = set;
     
    sigaction(SIGTERM, &act, 0);

    pushlist(&list_thread, pthread_a);
    pushlist(&list_thread, pthread_b);

    //далее идет куча других необходимых действий,
    //в процессе которых эти потоки запускаются,
    //останавливаются и производится куча всего остального
}


Как должна выглядеть функция, вызванная в new_signal_handler и способная вернуть мне list_thread? Прошу объяснить так сказать популярно для дурака:)

Это сообщение отредактировал(а) nullpoint - 30.1.2015, 19:44
PM MAIL   Вверх
xvr
Дата 2.2.2015, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(nullpoint @  30.1.2015,  19:42 Найти цитируемый пост)
Как должна выглядеть функция, вызванная в new_signal_handler и способная вернуть мне list_thread?

Сделайте list_thread глобальным

PM MAIL   Вверх
nullpoint
Дата 2.2.2015, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



А какой тогда смысл в этом
Цитата(xvr @  30.1.2015,  16:40 Найти цитируемый пост)
Вызовите из обработчика функцию, которая вам вернет список потоков второго приложения

если я и так получу доступ к списку?
PM MAIL   Вверх
xvr
Дата 3.2.2015, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(nullpoint @  2.2.2015,  21:53 Найти цитируемый пост)
А какой тогда смысл в этом

Никакого. 
Цитата(nullpoint @  2.2.2015,  21:53 Найти цитируемый пост)
если я и так получу доступ к списку? 

Это и есть цель. Я же не знаю, как у вас устроен список задач. Это может быть и глобал, может быть и что то приватное в модуле, может быть какой нибудь класс-синглетон. Через функцию можно получить список задач из любого из этих мест, поэтому я ее и упомянул.

PM MAIL   Вверх
Ihost
Дата 6.2.2015, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 14.9.2012

Репутация: нет
Всего: нет



Цитата(nullpoint @  30.1.2015,  19:42 Найти цитируемый пост)
Как должна выглядеть функция, вызванная в new_signal_handler и способная вернуть мне list_thread?
Во-первых совместное использование потоков pthread и классических обработчиков сигналов предполагает необходимость мануального распределение сигналов по потокам, иначе может иметь место быть неопределенное поведение, в частности осуществить вызов http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html
Во-вторых для организации передачи сигналов в непосредственные потоки, можно воспользоваться следующей функциональностью http://stackoverflow.com/questions/4208929...o-pthreads-in-c

PM MAIL   Вверх
nullpoint
Дата 17.2.2015, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 4.6.2013

Репутация: нет
Всего: нет



Ihost, мне не нужно было передавать сигнал в потоки, мне нужно было передать имена потоков в обработчик сигнала. Т.е. сигнал приходит в основной поток, вызывается обработчик сигнала, и вот из этого обработчика у меня вызывается функция, на вход которой подаются потоки, которые нужно закрыть. Созданные потоки не должны знать, что пришел какой-то сигнал, мы просто говорим им завершить работу без указания причины.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.