提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本篇主要是本小白对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;
}
总结
以下为该高级信号编程简图: