0
点赞
收藏
分享

微信扫一扫

Java序列化之Hessian实现方案

我阿霆哥 2024-08-12 阅读 31

 信号

 信号类型

 信号的处理方式

 函数接口

signal

 定时器: alarm 

定时器举例

(1)定义 定时器的结构体

#ifndef __TIMER_H__
#define __TIMER_H__
typedef struct timer
{
     int IntervalSeconds;            //间隔秒数
     void (*ontime_handler)(void);   //ontimer处理函数
}mtimer_t;

extern int SetTimerInterval(mtimer_t *ptm,int seconds,void(*pfun)(void));
extern void StartTimer(mtimer_t *ptm);
extern void StopTimer(mtimer_t *ptm);
#endif

 设置定时器,开启定时器,关闭定时器函数

#include <stdio.h>
#include "timer.h"
#include <unistd.h>
#include <signal.h>

mtimer_t *ptimer=NULL;
/*设置定时器对应的时间间隔和ontimer事件*/
int SetTimerInterval(mtimer_t *ptm,int seconds,void(*pfun)(void))
{
    ptimer=ptm;
    ptm->IntervalSeconds=seconds;
    ptm->ontime_handler=pfun;
}
/*开启定时器*/
void StartTimer(mtimer_t *ptm)
{
    signal(SIGALRM,timer_handler);
    alarm(ptm->IntervalSeconds);
    return;
}
/*定时器对应处理函数*/
void timer_handler(int signo)
{
    ptimer->ontime_handler();
    alarm(ptimer->IntervalSeconds);//循环定时器
    return;
}
/*停止定时器*/
void StopTimer(mtimer_t *ptm)
{
    alarm(0);     //关闭定时器
    signal(SIGALRM,SIG_DFL);  //设置会默认属性
    return;
}

主函数

#include "timer.h"
#include <stdio.h>
void handler(void)
{
 printf("时间到了,界面刷新\n");
 return;
}
int main()
{
    mtimer_t mtimer;
    char ch=0;
    SetTimerInterval(&mtimer,2,handler);
    StartTimer(&mtimer);
    while(1)
    {
        ch=getchar();
        if('d'==ch)//输入d停止定时器
        {
            StopTimer(&mtimer);
        }
        else if('a'==ch)//输入a开启定时器
        {
            StartTimer(&mtimer);
        }
        else if('q'==ch)//输入q退出程序
        {
            break;
        }

    }
    return 0;
}

运行结果 

 

 kill 

父子进程进行通信 

#include "../head.h"
pid_t pid;
void handler_child(int signo)
{
    if(signo==SIGUSR1)
    {
        printf("好的,老爸快去做饭\n");//1.(4)子进程响应父进程的SIGINT信号
    }
    else if(SIGQUIT==signo)
    {
        printf("爸,我吃饱了\n");
        kill(getppid(),SIGUSR2);//2.(2)给父进程发送信号
    }
}
void handler_parent(int signo)
{
    if(signo==SIGINT)
    {
        printf("儿子,老爸回来了\n");
        kill(pid,SIGUSR1);//1.(2)给子进程发送信号
    }
    else if(signo==SIGUSR2)//2.(4)父进程响应子进程SIGQUIT信号
    {
        printf("吃饱就好\n");
    }
    return;
}
int main()
{
      pid = fork();
    if (-1 == pid)
    {
        perror("fail to fork");
        return -1;
    }
    if (0 == pid)
    {
        signal(SIGUSR1,handler_child);//1.(3)子进程接受信号


/***************************************
*子进程忽略ctrl+c信号,防止被关闭,
*因为Ctrl+c会同时关闭父子进程,
*父进程切换了Ctrl+c的处理函数,子进程没有切换
****************************************/
        signal(SIGINT,SIG_IGN);


        signal(SIGQUIT,handler_child);//2.(1),切换ctrl+\的处理函数
    }
    else if (pid > 0)
    {   
        signal(SIGINT,handler_parent);//1.(1),切换ctrl+c的处理函数

/***************************************
*父进程忽略ctrl+c信号,防止被关闭,
*因为Ctrl+\会同时停止父子进程,
*子进程切换了Ctrl+\的处理函数,父进程没有切换
****************************************/
        signal(SIGQUIT,SIG_IGN);


        signal(SIGUSR2,handler_parent);//2.(3)父进程接收信号
    
    }

    while (1)
    {

    }

    return 0;
}

运行结果 

 

举报

相关推荐

0 条评论