URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4964
[ Назад ]

Исходное сообщение
"Обработка сигнала SIGALRM"

Отправлено Kompot , 21-Дек-05 17:47 
Просмотрите пожалуйста код. Каждые 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 );
    }
}


Содержание

Сообщения в этом обсуждении
"Обработка сигнала SIGALRM"
Отправлено DeadMustdie , 22-Дек-05 10:39 
Можно попробовать добавить флаг SA_RESTART в поле sa_flags.
Не факт, правда, что поможет.

"Обработка сигнала SIGALRM"
Отправлено Grey , 22-Дек-05 17:25 
>Просмотрите пожалуйста код. Каждые 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 тогда ожидание прервано сигналом.


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