Linux 信号编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本篇主要是本小白对Linux 信号编程一些笔记,希望对一同学习Linux的伙伴有所帮助。
如有发现错误,欢迎指出,一同进步!


一、信号编程是什么?

信号是一种软件中断,它提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式。在linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某进程发生了什么事件,还可以给进程传递数据。

二、使用步骤

1.引入库

代码如下(示例):

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
//判断并接受数据函数
int sigqueue(pid_t pid, int sig, const union sigval value);
//发送数据函数

struct sigaction {
		void     (*sa_handler)(int);
		void     (*sa_sigaction)(int, siginfo_t *, void *);
		(siginfo_t *指针结构体,内可包含多信息)
		sigset_t   sa_mask;(用于堵塞)
		int        sa_flags;
		void     (*sa_restorer)(void);													
};
sa_flag是一个选项,主要理解两个
SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启
SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针(入门常用)
联合体
union sigval {
		int   sival_int;
		void *sival_ptr;
};

2.读入数据

代码如下(示例):

接受数据程序

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

//int sigqueue(pid_t pid, int sig, const union sigval value);

void handlder(int signum,siginfo_t *info,void *context)
{
		printf("get the signum =%d",signum);
		if(context != NULL)
		{
		printf("get data =%d\n",info->si_int);
		printf("get the id =%d\n",getpid());
		printf("get the data =%d\n",info->si_value.sival_int);
		}

}
//int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
int main()
{

		struct sigaction act;
		act.sa_sigaction = handlder;
		act.sa_flags = SA_SIGINFO; 
		sigaction(SIGUSR1,&act,NULL);
		while(1);
		return 0;
}


发送数据程序

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


//int sigqueue(pid_t pid, int sig, const union sigval value);


int main(int argc,char **argv)
{
		
		int pid = atoi(argv[2]);
		int sig = atoi(argv[1]);
		union sigval da;
		da.sival_int = 100;
		
		sigqueue(pid,sig,da);

		return 0;
}

总结

以下为该高级信号编程简图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值