Linux嵌入式学习—信号通讯

1.信号基本概念

信号(signal)是linux进程通讯中唯一的异步通讯方式。

信号从软件层次上看是对中断机制的一种模拟。一个进程收到信号时的处理方式与CPU收到中断请求时的处理方式一样。收到信号的进程会跳入信号处理函数,执行完后再跳回原来的位置继续执行。

信号来源:有一类信号是已经被定义好的,如数据异常、指令异常、定时器、abort等。他们都有自己特殊的用法,如:发生异常时会触发异常信号。

2.头文件

#include <signal.h>

3.函数原型

ypedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

4.代码测试

通常情况下,SIGKILL 信号不能被修改,也不能被忽略
而终止信号 SIGINT 能被修改,能被忽略

#include <signal.h>
#include<stdio.h>


//typedef void (*sighandler_t)(int);
//sighandler_t signal(int signum, sighandler_t handler);

//自处理信号函数
void handler(int signnum)
{
	printf("the signnum is :%d",signnum);

	switch(signnum){
		case 2:
			printf("SIGNINT\n");
			break;
		case 9:
			printf("SIGKILL\n");
			break;
		case 10:
			printf("SIGUSR1\n");
			break;

	}
}

int main()
{
	pid_t pid;
	signal(SIGINT,handler);
	signal(SIGKILL,handler);
	signal(SIGUSR1,handler);
	printf("the pid:%d\n",getpid());

	while(1);
	return 0;
}
the pid:30134
Terminated

自定义kill信号

#include <signal.h>
#include<stdio.h>
#include<sys/types.h>



int main(int argc,char **argv)
{
	int signnum;
	int pid;
	
	char cmd[128] = {0};

	signnum = atoi(argv[1]);
	pid = atoi(argv[2]);

	printf("signnum:%d pid:%d\n",signnum,pid);

//	kill(pid,signnum);
	printf("send signal is ok!\n");
	
	sprintf(cmd,"kill:%d %d",signnum,pid);
	system(cmd);

	return 0;
}

学识浅薄,希望可以帮到您

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值