Просмотрите пожалуйста код. Каждые 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 );
}
}
Можно попробовать добавить флаг SA_RESTART в поле sa_flags.
Не факт, правда, что поможет.
>Просмотрите пожалуйста код. Каждые 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 тогда ожидание прервано сигналом.
DeadMustdie, Grey, большое спасибо. Вы оба правы. Так можно сделать, но мне кажется, что должен быть другой более красивый способ.