首页 > 系统相关 >Linux之信号

Linux之信号

时间:2023-08-15 17:56:02浏览次数:47  
标签:set 函数 int 信号处理 信号 Linux sa

信号集类型sigset_t

定义

typedef struct
{
    unsigned long sig[_NSIG_WORDS];
} sigset_t

相关函数

sigemptyset(sigset_t *set)			//初始化由set指定的信号集,信号集里面的所有信号被清空
sigfillset(sigset_t *set)			//调用该函数后,set指向的信号集中将包含linux支持的64种信号
sigaddset(sigset_t *set, int signum)		//在set指向的信号集中加入signum信号;
sigdelset(sigset_t *set, int signum)		//在set指向的信号集中删除signum信号;
sigismember(const sigset_t *set, int signum)	//判定信号signum是否在set指向的信号集中。

sigaction结构体

struct sigaction
{
    void (*sa_handler)(int);
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer)(void);
}
  • sa_handler:函数指针,指向信号处理函数。默认使用此函数处理信号
  • sa_sigaction:同样是信号处理函数,有三个参数,可以获得关于信号更详细的信息。可以通过参数三使用此函数处理信号。即参数一和参数二是二选一的。
  • sa_mask:信号处理函数执行期间需要被屏蔽的信号
  • sa_flags:指定信号处理的行为
    • SA_RESTART,使被信号打断的系统调用自动重新发起
    • SA_NOCLDSTOP,使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号
    • SA_NOCLDWAIT,使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程
    • SA_NODEFER,使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号
    • SA_RESETHAND,信号处理之后重新设置为默认的处理方式
    • SA_SIGINFO,使用 sa_sigaction 而不是 sa_handler 作为信号处理函数
  • sa_restorer:废弃不使用

Linux下信号处理机制

Linux下的信号采用的异步处理机制,当进程收到信号时,操作系统会中断进程当前的正常流程,转而进入信号处理函数执行操作,完成后再返回中断的地方继续执行,且信号处理期间系统不会再次触发它,即处理期间如果有同类型的信号发来会被屏蔽。所以我们希望信号处理函数执行快、尽可能少错过信号。
一般的解决方案是,信号处理函数用于通知主循环发生信号,具体的处理逻辑放在主循环中。

统一事件源

信号处理函数使用管道将信号传递给主循环,信号处理函数往管道的写端写入信号值,主循环则从管道的读端读出信号值,使用I/O复用(select、poll、epoll)系统调用来监听管道读端的可读事件,这样信号事件与其他文件描述符都可以通过epoll来监测,从而实现统一处理

使用管道通信

在linux下,使用socketpair函数能够创建一对套接字进行通信

#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
  • domain:协议族
  • type:协议。SOCK_STREAM(基于TCP)或者SOCK_DGRAM(基于UDP)
  • protocol:类型,只能为0
  • sv[2]:即管道两端,均可进行读写操作
  • 返回值:成功为0,失败为-1

标签:set,函数,int,信号处理,信号,Linux,sa
From: https://www.cnblogs.com/beishangeyu/p/17630183.html

相关文章

  • 鸟哥的Linux私房菜服务器架设篇
    第七章:网络安全与主机基本防护1、了解数据包的流向、然后根据该流向制定系统强化的流程;2、数据包进入主机的流程: 3、linux防火墙机制默认有两层:   a、第一层是数据包过滤式的IPFilter/Netfilter防火墙;   b、第二层是软件管理的superdaemon/TCPWrappers;4、常见的攻......
  • linux中find命令用法
    1、find test   在当前工作目录中查找名称为test的所有文件2、find/home-nametest  查找/home目录下的所有文件,名称为test3、find/home -inametest   找到名称为test的所有文件,并在/home目录中同时包含大写和小写字母4、find/-typed-nametest   在/......
  • linux jdk 不生效解决方法
    1.安装jdk1.8。2.修改/etc/profile中的JAVA_HOME为新的jdk路径,并执行source/etc/profile。3.执行java-version,这个时候显示jdk还是1.7版本。4.执行:whichjavawhichjavac  将以上两条指令执行结果中的java、javac文件删除。5.执行:ln-s$JAVA......
  • Linux的Redis安装部署
    简介redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。redis的特点就是:快,可以基于内存存储数据并提供超低延迟、超快的检索速度一般用于在系统中提供快速缓存的能力。安装配置EPEL仓库EPEL的全称叫ExtraPackagesforEnt......
  • Linux环境变量
    Linux是一个多用户的操作系统。多用户意味着每个用户登录系统后,都有自己专用的运行环境。而这个环境是由一组变量所定义,这组变量被称为环境变量。用户可以对自己的环境变量进行修改以达到对环境的要求。设置环境变量的方法对所有用户生效的永久性变量这类变量对系统内的所有用户......
  • Linux管理目录和文件2(Ubunt
    一:mkdir创建目录格式:mkdir[选项]目录名其中的目录名可以是相对路径也可以是绝对路径。mkdir有两个常见的选项,如下表所示选项说明-m设置新建目录的权限-p指定路径的名称,若不存在,会自动创建,一次可创建多个目录  -m选项涉及到权限,在桌面这个目录下创建一个新的目录mydir2,使用ls可......
  • Linux常用的命令
    1.把一个目录的文件拷贝另一个文件夹sudocp-p/home/likewei/lib/needlib/*/home/likewei/lib/112.pwd显示当前所在的目录3.ls显示当前目录下的文件4.cd切换路径,cd..返回到上一级路径5.mkdir新建目录6.rmdir删除目录7.touch新建文件8.cp复制文件9.rm删除文......
  • 时序数据库TimescaleDB 功能介绍、单节点、集群安装部署、centos、linux
    简介TimescaleDocumentation|GettingstartedwithTimescaleTimescale是一个用于时间序列,事件和分析的PostgreSQL数据平台。提供了PostgreSQL的可靠性,这是时间序列的超能力TimescaleDB,。它提供自动备份和还原、复制的高可用性等功能,无缝缩放和调整大小等等性能对比:Ti......
  • 掌握Linux Top命令:优化系统性能的关键
    简介:在Linux系统中,了解系统的当前状态以及资源的使用情况对于管理员和开发人员来说至关重要。Linux提供了许多工具来监视和管理系统性能,其中一个最重要的工具是Top命令。本文将介绍如何使用Top命令来监视系统资源、进程和性能,并提供一些实用的技巧来优化系统性能。1.什么是Top命令......
  • 在Linux系统中如何给文件夹设置777权限?
    Linux系统秉承着“一切皆文件”的原则,所以就需要对文件的权限进行把控,如果不对文件进行权限把控,很容易给自己和别人造成损失和困扰。那么如何给文件夹设置777权限呢?以下是详细的内容:在Linux系统中,文件和文件夹有不同的权限控制。其中,777权限是指具有读、写和执行权限的最......