百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Linux基础知识(五)

toyiye 2024-06-21 12:26 8 浏览 0 评论

本篇介绍一些Linux信号处理相关内容.

1. 信号的概念

信号是进程间的一种异步通信机制, 是软件层面对中断机制的模拟.

中断就是打断正在执行的程序, 跳转到另一段程序区执行, 执行完毕后返回被打断的程序继

续执行.

linux 系统中支持的信号 1~64, unix 系统中支持的信号 1~48

kill -l : 列出系统中支持的所有信号

宏的名称以 SIG 开头, 使用宏可以避免不同系统对信号的编码差异

信号的本质就是一个数字, 编程时不建议直接使用该数字, 而是使用对应的宏, 这样可移植性高.

在 linux 系统中, 1~31 是不可靠信号, 早期信号, 不支持排队,34~64 是可靠信号, 支持排队, 不会丢失.

2. 信号的何产生

2.1 键盘发送, 只能产生部分信号

ctrl + c ---> 发送信号 SIGINT 2

ctrl + \ ---> 发送信号 SIGQUIT 3

2.2 程序出错, 也是只能产生部分信号段错误

段错误 ---> SIGSEGV

总线错误 ---> SIGIO

子进程结束 ---> SIGCHLD

2.3 kill 命令 ( 可以发所有的信号), 给指定的进程法 1~64 的信号

kill + 信号 + 进程PID ---> kill -9 1818

2.4 系统函数 kill 函数

int kill (pid_t pid, int sig);

3. 进程处理信号的方式

(1) 默认处理, 系统提供, 多半是退出进程, 会导致进程非正常退出

(2) 忽略信号, 信号不被处理

(3) 自定义处理函数, 信号按照程序员的代码进行处理

注意:

1) 有些信号是不能被自定义或者忽略的, 比如信号 9 kill -9

2) 进程可以给其他的进程法信号, 但是只能给本用户的进程发信号, root 用户可以给所有 的用户进程发信号

4. 信号相关的 API

4.1 signal 函数

signal函数的作用有两个, 一是设置信号默认处理方式,二是注册一个信号处理函数

typedef void ( *sighandler_t ) ( int );
sighandler_t signal ( int signum, sighandler_t handler );
 signum: 信号对应的编号, 或者宏
 handler: 可以有三个类型取值
 (1) SIG_DFL 信号恢复成默认方式
 (2) SIG_IGN 忽略信号 ignore
 (3) 自定义函数的地址 函数指针
 
 typedef void ( *sighandler_t ) ( int );
 void (*)(int) 是函数指针类型, 指一个返回值为 void, 参数为 int 类型的函数指针类型
 

4.2 进程中信号的发送

kill(重点掌握) / alarm / raise / sigqueue

(1) kill() 函数

作用: 用于向任何进程组或进程发送信号

int kill (pid_t pid, int sig)
pid : 指定被哪个或者哪些进程发送信号
 pid>0, 给 pid 对应的进程发送信号
 pid=0, 本组所有进程发送信号
 pid=-1, 给所有由权限的进程发送信号
 pid<-1, 给某个进程组中的信号发送信息
sig : 准备发送的信号代码,假如其值为零则没有任何信号送出,但是系统会执行错误检查,通常会利用sig值为零来检验某个进程是否仍在执行
返回值 : 成功执行时,返回0; 失败返回-1,错误信息会存在于errno

注意: 不能给任意的进程发信号, 例如给 1 号进程发送 SIGINT 信号是不可要的, 权限不够

(2) alarm() 函数

作用: seconds 秒后给当前进程发送一个 SIGALARM 信号

unsigned int alarm ( unsigned int seconds )
seconds : 设置多少秒之后发送SIGALARM信号
返回值 : 如果在seconds秒内再次调用了alarm函数设置了新的闹钟,则后面定时器的设置将覆盖前面的设置,即之前设置的秒数被新的闹钟时间取代;当参数seconds为0时,之前设置的定时器闹钟将被取消,并将剩下的时间返回

(3) raise()函数

作用: 用于向调用进程发送信号

int raise ( int sig );
sig : 准备发送的信号代码
返回值 : 成功执行时返回0,失败返回非0

总结:

int raise(int signum) 等价于 kill(getpid(),signum);

alarm(seconds) 等价于 sleep(seconds) + kill(getpid(),SIGALRM)

5. 信号的屏蔽

5.1 信号屏蔽信号的原因

信号的产生有时候是无法确定和控制的, 可以使用信号屏蔽技术让信号的处理时间延后, 信号屏蔽主要应用于关键代码的执阶段

信号屏蔽不是阻止信号的到来, 信号是无法阻止的, 而是将信号的处理延后, 待关键代码执行完毕后再解除信号的屏蔽

5.2 信号屏蔽函数

sigprocmask() 函数可以完成信号的屏蔽和解除信号的屏蔽

int sigprocmask (int how, const sigset_t *set, sigset_t *oldset )
how : 用于指定信号修改的方式,可能选择有三种
 SIG_BLOCK : 将set所指向的信号集中包含的信号加到当前的信号掩码中,即信号掩码和set信号集进行或操作
 SIG_UNBLOCK : 将set所指向的信号集中包含的信号从当前的信号掩码中删除,即信号掩码和set进行与操作
 SIG_SETMASK : 将set的值设定为新的进程信号掩码,即set对信号掩码进行了赋值操作
set : 为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL
oldset : 传出参数, 也是指向信号集的指针,在此存放原来的信号集。可用来检测信号掩码中存在什么信号
返回说明 : 成功执行时,返回0。失败返回-1,errno被设为EINVAL

5.3 信号集操作函数

(1) 将信号集合 set 中所有信号位置 1

int sigfillset(&set);

(2) 将信号集合 set 中所有信号为清 0

int sigemptyset(&set);

(3) 将信号集合 set 中与 signum 对应的 bit 置 1

int sigaddset(&set,signum);

(4) 将信号集合 set 中与 signum 对应的 bit 清 0

int sigdelset(&set,signum);

(5) 测试 signum 是否为 set 中的一个成员

int sigismember(const &set,signum);

如果是其中一个成员返回 1, 否则返回 0

(6) 获取被屏蔽的信号, 就是在执行关键代码期间发送过来的信号

int sigpending(&set);

引申:

1. 主进程中调用了 signal(SIGINT,...) ,然后执行 fork(), 那么子进程中在怎样处理 SIGINT 信号

子进程继承了父进程的信号处理策略

2. 如果问题 1 中换成 vfork 会怎样

vfork 创建子的子进程不会继承父进程的信号处理策略

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码