信号
信号类型
信号的处理方式
函数接口
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;
}
运行结果