- 论坛徽章:
- 0
|
typedef struct sipt_timer_set TimerSet;
struct sipt_timer_set
{
int numOfTimer;
//CrlData timerCrl;
sem_t mutex;
struct itimerval newitimer;
struct itimerval olditimer;
list_t timerList;
};
typedef struct response_Crl_Set
{
//CrlData timerCrl;
sipt_list resplist;
sem_t mutex, nresp;
int resp_thread_run;
pthread_t resp_thread;
}RespCrlSet;
//2个全局变量
extern TimerSet *timerset;
extern RespCrlSet *respset;
int
main(int argc, char *argv[])
{
sipt_signal( SIGALRM , funSigAlrm , 0 );
timerset = sipt_timerSet_new();
respset = sipt_respSet_new();
// 启动一个新线程
sipt_start_resp_thread( respset );
int i;
for( i = 0 ; i < 100 ; i ++ )
{
sipt_insert_timer( timerset , 200 );
usleep( 1000000 );
}
sthread_join( &respset->;resp_thread );
}
// 信号处理函数,当收到SIGALRM信号是执行
void
funSigAlrm()
{
printf( "signal received\n" );
sem_post( &respset->;nresp );
int nsig = 0;
int rval;
rval = sem_getvalue( &respset->;nresp , &nsig );
printf( "in sighander nsig = %d rval = %d\n" , nsig , rval );
}
// 线程执行函数
void*
sipt_resp_thread( void *myarg )
{
//TimerSet *timset = (TimerSet*)myarg;
TimerSet *timset = timerset;
RespCrlSet *respset = (RespCrlSet*)myarg;
TimeVal *tim = NULL;
int nsig = 0;
int nresp = 0;
while(1)
{
int oo;
oo = sem_wait( &respset->;nresp); // sem_wait函数被中断 errno 被设置为4
sem_wait( &respset->;mutex );
printf( "oo = %d , EAGAIN = %d EINTR = %d\n" , oo , EAGAIN , EINTR );
if( errno )
{
perror( "sem_wait() fail: " );
errno = 0;
}
if( respset->;resp_thread_run != 1 )
break;
//do something to response
int rval;
rval = sem_getvalue( &respset->;nresp , &nsig );
printf( "in thread nsig = %d , rval = %d\n" , nsig , rval );
nresp++;
printf( "Send response[%d] \n" , nresp );
sem_post( &respset->;mutex );
sem_wait( &timset->;mutex );
//printf( "timer : %d\n" , timset->;numOfTimer );
tim = (TimeVal*)timset->;timerList.node->;element;
sipt_list_remove( &timset->;timerList , 0 );
timset->;numOfTimer--;
gettimeofday( tim , NULL );
if( timset->;numOfTimer >; 0 )
{
set_itimerval2( &timset->;newitimer , 0 , 0 , tim ,
(TimeVal *) timset->;timerList.node->;element );
setitimer( ITIMER_REAL , &timset->;newitimer , &timset->;olditimer );
}
sem_post( &timset->;mutex );
sfree( tim );
tim = NULL; printf( "finish one process\n" );
}
sem_post( &respset->;mutex );
}
程序是这样执行的,但程序收到一条消息是,将延迟1段时间然后发出response。于是我在收到消息时设置一个时间,然后设置定时器,当消息到达时发SIGALRM信号,信号出来函数收到信号后sem_post( &respset->;nresp ); ,nresp的值将加1,而另一个线程阻塞在sem_wait负责发response,当信号处理函数发n次sem_post(),nrep的值将加n,线程sem_wait()将减1,发一次response,循环使得发出相应次数的response。现在 问题在于sem_wait()只正常执行一次,第2次就被中断,返回-1.
执行结果
size of timer list = 1
signal received
in sighander nsig = 1 rval = 0
oo = 0 , EAGAIN = 11 EINTR = 4
errno = 0
in thread nsig = 0 , rval = 0
Send response[1]
size of timer list = 2
finish one process
signal received
in sighander nsig = 1 rval = 0
oo = -1 , EAGAIN = 11 EINTR = 4 //sem_wait 被中断了
errno = 4
sem_wait() fail: : Interrupted system call //perror()的输出
in thread nsig = 1 , rval = 0
Send response[2]
finish one process
oo = 0 , EAGAIN = 11 EINTR = 4
errno = 0
in thread nsig = 0 , rval = 0
Send response[3]
Segmentation fault |
|