|
|
大家看看这段代码有什么问题,运行起来时定时器并没起作用,而是一直不断的打印出“settimer.....................”,怎么设置itv.it_interval.tv_sec 都没有用,一样的效果,总是很快的打印,感觉是进了死循环。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <signal.h>
void set_timer(void)
{
struct itimerval itv,oldtv;
itv.it_interval.tv_sec = 5;
itv.it_interval.tv_usec = 0;
itv.it_value.tv_sec = 5;
itv.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &itv, &oldtv);
}
void sigalrm_handler(void)
{
printf("settimer.....................\n");
}
void *run_thread_function(void *arg)
{
int i = 0, res ;
struct sigaction sigact;
//######## 设置线程为可取消 ###############//
res = pthread_setcancelstate (PTHREAD_CANCEL_ENABLE , NULL);
if (res != 0)
{
perror ("Thread_run pthread_setcancelstate failed");
close (hCom1);
exit (EXIT_FAILURE) ;
}
//######## 取消前先执行 pthread_join ###############//
res = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED , NULL);
if (res != 0)
{
perror ("Thread_run pthread_setcanceltype failed");
close (hCom1);
exit (EXIT_FAILURE) ;
}
sigact.sa_flags = SA_RESTART;
sigact.sa_handler =(void (*)(int))sigalrm_handler;
sigemptyset(&sigact.sa_mask);
sigaction(SIGALRM, &sigact, NULL);
set_timer();
while (1)
{
//send_data();
//sleep(3);
}
pthread_exit (0);
}
void send_data(void)
{
write(hCom1,"0123456789",10);
printf("send data: 0123456789\n");
}
其中,把setitimer(ITIMER_REAL, &itv, &oldtv);改为:setitimer(ITIMER_REAL, &itv, NULL);
以及把sigact.sa_flags = SA_RESTART;改为:sigact.sa_flags = 0;
也是一样的效果,究竟该怎么做呀? |
|