实现终端打印 **world*hello**apue*******

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <signal.h>
#include <string.h>

typedef void (*sig_func)(void *);
typedef struct
{
    int delay;
    sig_func handler;
    char *ptr;
}alarm_t;
static alarm_t *alarm_p[10];
void anytimer_alarm(int delay,sig_func handler,char * ptr);
static void any1(void *s)
{
    printf("%s",(char *)s);
    fflush(NULL);
}

static void any2(void *s)
{
    printf("%s",(char *)s);
    fflush(NULL);
}

static void any3(void *s)
{
    printf("%s",(char *)s);
    fflush(NULL);
}
/*
    信号到来对结构体中的数据进行操作
*/
static void alrm_handler(int s)
{
    for(int i = 0; i < 10; i++)
    {
        if(alarm_p[i] != NULL)
        {
            alarm_p[i]->delay -= 1;
            if(alarm_p[i]->delay == 0)
            {
                alarm_p[i]->handler(alarm_p[i]->ptr);
            }
        }
    }
}
/*
    把参数存到结构体里,将结构体的地址存到指针数组中
*/
void anytimer_alarm(int sec,sig_func handler,char * ptr)
{
    int i = 0;
    alarm_t *at = NULL;
    at = malloc(sizeof(alarm_t));
    if(at == NULL)
    {
        fprintf(stderr,"malloc():%s\n",strerror(errno));
        exit(1);
    }
    at->delay = sec;
    at->handler = handler;
    at->ptr = ptr;
    for( i;i < 10;i++)
    {
        if(alarm_p[i] == NULL)
        {
            alarm_p[i] = at;
            break;
        }
    }
    if(i == 10)
    {
        free(at);
        exit(1);
    }
}
int main(void)
{
    struct itimerval itv;
    struct sigaction act;
    //注册信号行为
    act.sa_handler = alrm_handler;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGALRM,&act,NULL);
    //注册信号间隔几秒发送一次
    itv.it_interval.tv_sec = 1;
    itv.it_interval.tv_usec = 0;
    itv.it_value.tv_sec = 1;
    itv.it_value.tv_usec = 0;
    setitimer(ITIMER_REAL,&itv,NULL);

    anytimer_alarm(3,any1,"hello");
    anytimer_alarm(2,any2,"world");
    anytimer_alarm(5,any3,"apue");
    /*
    **world*hello*apue******
    */
    while(1)
    {
        write(1,"*",1);
        sleep(1);
    }
    return 0;    
}

猜你喜欢

转载自www.cnblogs.com/Mr-zzzzzz/p/10587253.html