The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Обработка сигнала SIGALRM"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Обработка сигнала SIGALRM" 
Сообщение от Kompot Искать по авторуВ закладки(ok) on 21-Дек-05, 17:47  (MSK)
Просмотрите пожалуйста код. Каждые 2 секунды происходит 2 продряд срыва с ожидания семафора   sem_wait( &sem0 );
Что нужно дописать чтобы сигнал SIGALRM шел только в обработчик  callme(), и не шел в задачу ? Заранее спасибо.


#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <semaphore.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>

sem_t sem0;

void callme( int signo )
{
   sem_post( &sem0 );
}

int main()
{
    struct itimerval  new_itimerval;
    struct itimerval  old_itimerval;
    struct sigaction  new_sigaction;
    struct sigaction  old_sigaction;
    int asd = 0;

    sem_init( &sem0, 0, 0);

    sigemptyset( &new_sigaction.sa_mask);
    new_sigaction.sa_flags = SIGALRM;
    new_sigaction.sa_handler = &callme;

    if( sigaction( SIGALRM, &new_sigaction, &old_sigaction ) == -1)
    {
        perror("sigaction\n");
        return(1);
    }

    // current value
    new_itimerval.it_value.tv_sec = 3;
    new_itimerval.it_value.tv_usec = 0;
    // next value
    new_itimerval.it_interval.tv_sec = 2;
    new_itimerval.it_interval.tv_usec = 0;

    if( setitimer( ITIMER_REAL, &new_itimerval, &old_itimerval ) == -1 )
    {
        perror("setitimer");
        return(2);
    }

    while( asd < 100 )
    {
        sem_wait( &sem0 );
        asd++;
        printf("vrggbgbfghbghbhgbh...%d\n", asd );
    }
}

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

1. "Обработка сигнала SIGALRM" 
Сообщение от DeadMustdie emailИскать по авторуВ закладки(??) on 22-Дек-05, 10:39  (MSK)
Можно попробовать добавить флаг SA_RESTART в поле sa_flags.
Не факт, правда, что поможет.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Обработка сигнала SIGALRM" 
Сообщение от Grey Искать по авторуВ закладки(??) on 22-Дек-05, 17:25  (MSK)
>Просмотрите пожалуйста код. Каждые 2 секунды происходит 2 продряд срыва с ожидания
>семафора   sem_wait( &sem0 );
>Что нужно дописать чтобы сигнал SIGALRM шел только в обработчик  callme(),
>и не шел в задачу ? Заранее спасибо.
>
>
>#include <stdio.h>
>#include <unistd.h>
>#include <signal.h>
>#include <semaphore.h>
>#include <sys/time.h>
>#include <time.h>
>#include <unistd.h>
>#include <errno.h>
>
>sem_t sem0;
>
>void callme( int signo )
>{
>   sem_post( &sem0 );
>}
>
>int main()
>{
>    struct itimerval  new_itimerval;
>    struct itimerval  old_itimerval;
>    struct sigaction  new_sigaction;
>    struct sigaction  old_sigaction;
>    int asd = 0;
>
>    sem_init( &sem0, 0, 0);
>
>    sigemptyset( &new_sigaction.sa_mask);
>    new_sigaction.sa_flags = SIGALRM;
>    new_sigaction.sa_handler = &callme;
>
>    if( sigaction( SIGALRM, &new_sigaction, &old_sigaction ) == -1)
>
>    {
>        perror("sigaction\n");
>        return(1);
>    }
>
>    // current value
>    new_itimerval.it_value.tv_sec = 3;
>    new_itimerval.it_value.tv_usec = 0;
>    // next value
>    new_itimerval.it_interval.tv_sec = 2;
>    new_itimerval.it_interval.tv_usec = 0;
>
>    if( setitimer( ITIMER_REAL, &new_itimerval, &old_itimerval ) == -1
>)
>    {
>        perror("setitimer");
>        return(2);
>    }
>
>    while( asd < 100 )
>    {
>        sem_wait( &sem0 );
>        asd++;
>        printf("vrggbgbfghbghbhgbh...%d\n", asd );
>    }
>}


Просто надо посмотреть причину выхода из состояния ожидания семафора и если это EINTR тогда ожидание прервано сигналом.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Обработка сигнала SIGALRM" 
Сообщение от Kompot Искать по авторуВ закладки(??) on 27-Дек-05, 13:45  (MSK)
DeadMustdie, Grey, большое спасибо. Вы оба правы. Так можно сделать, но мне кажется, что должен быть другой более красивый способ.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру