Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > signal


Автор: Elyad 13.10.2006, 18:47
Пишу прогу, в которой надо по истечении недели вызывать функцию, которая шлет  широковещательные пакеты.
Но проблема в том, что в функцию signal нельзя поместить обработчик сигнала с несколькими разными аргументами, т.к. по определению она содержит только один целочисл. аргумент.
Мне же надо в функцию записать несколько разных аргументов : структуры адресов сокета, длины, переменные типа char ....
Что же делать?   
 smile 

Автор: bsa 13.10.2006, 20:39
использовать: sleep, usleep, nanosleep, например.

Автор: MAKCim 13.10.2006, 21:41
Elyad
в обработчике вообще не рекомендуется заниматься такой работой
создай поток, там реализуй ожидание
(alarm/seiitimer + sigwait/sigsuspend/pause; sleep)
сразу после передачи управления вызывай свою функцию
в основной программе соответственно будут основные действия программы

Автор: Elyad 16.10.2006, 11:27
Я пишу под FreeBSD, а там потоков нет!!!
А в общем я решил проблему так:
// все переменные необходимые для функции обьявлены как глобальные

void func(int i)
{
      my_funcion(...здесь введены все необходимые мне параметры);
}
alarm(604800);  // передача сигнала 1 раз в неделю, работает демон
signal(SIGALRM, &func);
 smile 
Ну вроде бы и все.
Если кто придумает более оптимальное решение  -  пишите!!! smile 

Автор: MAKCim 16.10.2006, 16:44
Цитата

Ну вроде бы и все.

не забудь глобальные переменные сделать типом
sig_atomic_t
Цитата

Я пишу под FreeBSD, а там потоков нет!!!

ну процессы то везде есть. В Linux-е вон тоже отдельного понятия потока не существует
Цитата

Если кто придумает более оптимальное решение  -  пишите!!!

Код

...
pid_t pid = fork();

if (pid == 0) {
    sigset_t sigset;
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGALRM);
    sigprocmask(SIG_BLOCK, &sigset);
    sigwait(&sigset, NULL);   /* ожидаем сигнала */
    function();  /* твоя функция */
}
...

процесс будет простаивать конечно, но это не особо расточительно
имхо, этот вариант лучше обработчика

Автор: kondr 16.10.2006, 16:45
Цитата

Я пишу под FreeBSD, а там потоков нет!!!


????
Что правда что ли?   smile  Я из ЮНИКсов с Линухом и Аиксом работал. Там с потоками все в порядке. 

На сколько я знаю, много вэб серверов крутится на FreeBSD. Так че они однопоточные? Что-то не верится...

Автор: Elyad 18.10.2006, 15:34
Открой книгу Стивенса У.Р. "Сетевое программирование" где черному по белому написано, что FreeBSD НЕ ПОДДЕРЖИВАЕТ ПОТОКИ.  smile 

Автор: bsa 18.10.2006, 16:58
Цитата(Elyad @ 18.10.2006,  15:34)
Открой книгу Стивенса У.Р. "Сетевое программирование" где черному по белому написано, что FreeBSD НЕ ПОДДЕРЖИВАЕТ ПОТОКИ.  smile

Интересно, а http://www.unobvious.com/bsd/freebsd-threads.html тогда о чем?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)