#include <stdio.h> #include <signal.h> #include <time.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/msg.h> #include <pthread.h> #include <sys/syscall.h> #if 1 int msg_qid; pthread_t recv_thread; typedef struct msgbuf { long msgtype; char msgtext[128]; } PRIV_MSG_INFO; int recv_task(void) { PRIV_MSG_INFO rcvmsg; for(;;) { if(msgrcv(msg_qid, (PRIV_MSG_INFO *)&rcvmsg, sizeof(PRIV_MSG_INFO), 0, 0) == -1) { printf("msgrcv error\n"); exit(254); } printf("recv msg: %s\n", rcvmsg.msgtext); } } void timer_thread(union sigval v) { PRIV_MSG_INFO sndmsg; // 定时器回调函数应该简单处理 printf("timer_thread function! %d\n", v.sival_int); sndmsg.msgtype++; sprintf(sndmsg.msgtext, "type %ld", sndmsg.msgtype); msgsnd(msg_qid, (PRIV_MSG_INFO *)&sndmsg, sizeof(PRIV_MSG_INFO), 0); } // int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid); // clockid:CLOCK_REALTIME, CLOCK_MONOTONIC,CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID // evp--存放环境值的地址,结构成员说明了定时器到期的通知方式和处理方式等 // timerid--定时器标识符 // int timer_settime(timer_t timerid, int flags, const struct itimerspec *new_value,struct itimerspec *old_value); // timerid--定时器标识 // flags--0表示相对时间,1表示绝对时间 // new_value--定时器的新初始值和间隔,如下面的it // old_value--取值通常为0,即第四个参数常为NULL,若不为NULL,则返回定时器的前一个值 int main() { int ret; timer_t timerid; struct sigevent evp; msg_qid = msgget(IPC_PRIVATE, 0666); if(msg_qid == -1) { printf("msgget error\n"); exit(254); } ret = pthread_create(&recv_thread, NULL, (void *)recv_task, NULL); if(ret != 0) { printf("Create pthread error!\n"); return -1; } memset(&evp, 0, sizeof(struct sigevent)); evp.sigev_value.sival_int = 111; // param for timer_thread evp.sigev_notify = SIGEV_THREAD; evp.sigev_notify_function = timer_thread; if (timer_create(CLOCK_REALTIME, &evp, &timerid) == -1) { perror("fail to timer_create"); exit(-1); } //第一次间隔it.it_value这么长,以后每次都是it.it_interval这么长,就是说it.it_value变0的时候会装载it.it_interval的值 struct itimerspec it; it.it_interval.tv_sec = 3; it.it_interval.tv_nsec = 0; it.it_value.tv_sec = 3; it.it_value.tv_nsec = 0; if (timer_settime(timerid, 0, &it, NULL) == -1) { perror("fail to timer_settime"); exit(-1); } /*等待线程结束*/ pthread_join(recv_thread, NULL); msgctl(msg_qid, IPC_RMID, 0); return 0; } #endif #if xxx #include <stdio.h> #include <time.h> #include <stdlib.h> #include <signal.h> #include <string.h> #include <unistd.h> void sig_handler(int signo) { printf("timer_signal function! %d\n", signo); } int main() { timer_t timerid; struct sigevent evp; struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_handler = sig_handler; act.sa_flags = 0; sigemptyset(&act.sa_mask); if (sigaction(SIGUSR1, &act, NULL) == -1) { perror("fail to sigaction"); exit(-1); } memset(&evp, 0, sizeof(struct sigevent)); evp.sigev_signo = SIGUSR1; evp.sigev_notify = SIGEV_SIGNAL; if (timer_create(CLOCK_REALTIME, &evp, &timerid) == -1) { perror("fail to timer_create"); exit(-1); } struct itimerspec it; it.it_interval.tv_sec = 3; it.it_interval.tv_nsec = 0; it.it_value.tv_sec = 3; it.it_value.tv_nsec = 0; if (timer_settime(timerid, 0, &it, 0) == -1) { perror("fail to timer_settime"); exit(-1); } pause(); return 0; } #endif