用户态API(定时器)

简介: #include #include #include #include #include #include #include #include #include #include #if 1int msg_qid;pthread_t recv_thread;t...

 

#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

 

目录
相关文章
|
6月前
|
存储 缓存 网络协议
posix API与网络协议栈的实现原理
posix API与网络协议栈的实现原理
|
6月前
|
网络协议 API
Posix API与网络协议栈实现原理
Posix API与网络协议栈实现原理
54 0
|
6月前
|
网络协议 API 网络性能优化
Posix API与网络协议栈的实现原理
Posix API与网络协议栈的实现原理
59 0
|
6月前
|
存储 API 数据安全/隐私保护
FreeRTOS入门教程(信号量的概念及API函数使用)
FreeRTOS入门教程(信号量的概念及API函数使用)
368 0
|
存储 API 索引
|
存储 API
21-FreeRTOS队列集API函数
21-FreeRTOS队列集API函数
|
存储 API 索引
|
存储 安全 API
22-RTOS 流缓冲区 API 函数
22-RTOS 流缓冲区 API 函数
|
JSON 前端开发 JavaScript
如何模拟后台API调用场景,很细!
在开发前后台分离项目并且通过不同团队来实现的时候,如何将后台设计的 API 准确的传达到前台,是一个非常重要的工作。
|
Linux API
Linux进程管理内核API函数pid_task( )
pid_task( ) 函数获取任务的任务描述符信息,此任务在进程pid的使用链表中,并且搜索的链表的起始元素的下标为参数type的值。
2130 0