1.信号:本质是个整数,用户模式下,信号是用来模拟硬件中断。
2.硬件中断:物理层面的
软件中断:模拟硬件中断
3.信号的产生:硬件,内核,进程
4.中断和轮询机制:轮询方式等消息
中断方式设置提示
5.信号处理过程:
进程A正在运行
进程B发送一个SIGINT信号
进程A收到 SIGINT信号,默认处理。
函数原型:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
#include<stdio.h>
#include<signal.h>
void sighand(int n)
{
printf("收到了%d信号\n",n);
}
int main()
{
signal(SIGINT,sighand);//注册对SIGINT信号的处理为sighand
int n=0;
while(1)
{
printf("helloworld%d\n",n++);
sleep(1);
}
}
linux提供的信号:64个
不可靠信号(非实时)
可靠(实时)
6.sigaction:
不仅仅可以接受信号做信号处理,还能在接受信号的同时接收一些消息。
函数原型:
#include <signal.h>
int sigaction(int signum,
const struct sigaction *act,
struct sigaction *oldact);
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
void hander(int n)
{
printf("基本信号处理函数\n");
}
void handAct(int n,siginfo_t* siginfo,void* arg)
{
printf("高级信号处理函数\n");
printf("n:%d,msg:%d\n" ,n,siginfo->si_int);
}
int main()
{
struct sigaction act = {0};
struct sigaction oldact = {0};
act.sa_handler = hander;
act.sa_sigaction = handAct;
act.sa_flags = SA_SIGINFO;
sigaction(2,&act,&oldact);
printf("pid:%d\n",getpid());
int n=0;
while(1){
printf(">>%d\n",n++);
sleep(1);
}
return 0;
}
7.kill函数:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
8.sigqueue
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
union sigval {
int sival_int;
void *sival_ptr;
};
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
int pid = atoi(argv[1]);
int signum = atoi(argv[2]);
union sigval uVal = {0};
uVal.sival_int = 66666;
sigqueue(pid,signum,uVal);
printf("pid:%d\n,signum:%d\n,uval:%d\n",pid,signum,uVal.sival_int);
return 0;
}
9.定时信号:定时发送一个信号SIGALAR alarm函数alarm(2);