0
点赞
收藏
分享

微信扫一扫

Java序列化之Hessian实现方案

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

 信号

 信号类型

 信号的处理方式

 函数接口

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(
while(1)
{
ch=getchar();
if('d'==ch)//输入d停止定时器
{
StopTimer(
}
else if('a'==ch)//输入a开启定时器
{
StartTimer(
}
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 条评论