Linux-信号

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);
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值