| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux学习日记17——信号 -> 正文阅读 |
|
[系统运维]Linux学习日记17——信号 |
学习视频链接 黑马程序员-Linux系统编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1KE411q7ee?p=129 目录 一、信号的概念1.1 信号共性简单、不能携带大量信息、满足条件才能发送 1.2 信号的机制1、A 给 B 发送信号,B 收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似 —— 异步模式。但信号是软件层面上实现的中断,早期常被称为 “软中断”。 2、信号的特质: 由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性。但对于用户来说,这个延 3、每个进程收到的所有信号,都是由内核负责发送的,内核处理。 1.3 与信号相关的事件和状态1、产生信号: (1) 按键产生,如:Ctrl + c、 Ctrl + z、 Ctrl + \ 【Ctrl + c、Ctrl + \ 都能终止程序,但是发送的信号不同。Ctrl + z 暂停进程,通过输入 fg 指令可以让他继续执行】 (2) 系统调用产生,如:kill、 raise、 aborte (3) 软件条件产生,如:定时器 alarm (4) 硬件异常产生,如:非法访问内存(段错误)、除 0(浮点数例外)、内存对齐出错(总线错误) (5) 命令产生,如:kill 命令 2、递达: 递送并且到达进程 3、未决: 产生和递达之间的状态。主要由于阻塞(屏蔽)导致该状态 4、信号的处理方式 (1) 执行默认动作 (2) 忽略(丢弃) (3) 捕捉(调用户处理函数) 5、Linux 内核的进程控制块 PCB 是一个结构体,task struct,除了包含进程 id,状态,工作目录,用户id,组id,文件描述符表,还包含了信号相关的信息,主要指阻塞信号集和未决信号集 6、阻塞信号集(信号屏蔽字): 将某些信号加入集合,对他们设置屏蔽,当屏蔽 x 信号后,再收到该信号,该信号的处理将推后(解除屏蔽后) 7、未决信号集: (1) 信号产生,未决信号集中描述该信号的位立刻翻转为 1,表信号处于未决状态。当信号被处理对应位翻转回为 0。这一时刻往往非常短暂 (2) 信号产生后由于某些原因(主要是阻塞)不能抵达。这类信号的集合称之为未决信号集。在屏蔽解除前,信号一直处于未决状态 8、图示 下面图中未决信号集有一个中断信号将要被执行,信号被处理后变为 0? 下面图中未决信号集有一个中断信号将要被执行,但是信号屏蔽字将这个信号屏蔽了,一直处理不了 1.4 信号的编号常规信号为前 31 个,都有默认事件和处理动作 实时信号没有默认动作 1.5 信号四要素?1、编号? 2、名称? 3、事件? 4、默认处理动作 通过 man 7 signal 查看 kill 进程id? 默认使用信号量为 15 的信号杀死进程 (1) SIGHUP:当用户退出 shell 时,由该 shell 启动的所有进程将收到这个信号,默认动作为终止进程 (2) SIGINT:挡用户按下了 <ctrl+c> 组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程 (3) SIGQUIT:当用户按下 <ctrI+\> 组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信号。默认动作为终止进程 (4) SIGILL:CPU 检测到某进程执行了非法指令。默认动作为终止进程并产生 core 文件 (5) SIGTRAP:该信号由断点指令或其他 trap 指令产生。默认动作为终止里程并产生 core 文件 (6) SIGABRT:调用 abort 函数时产生该信号。默认动作为终止进程并产生 core 文件 (7) SIGBUS:非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生 core 文件 (8) SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等所有的算法错误。默认动作为终止进程并产生 core 文件 (9) SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可以杀死任何进程的方法 (10) SIGUSR1:用户定义的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程 (11) SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生 core 文件 (12) SIGUSR2:另外一个用户自定义信号,程序员可以在程序中定义并使用该信号。默认动作为终止进程 (13) SIGPIPE:Broken pipe 向一个没有读端的管道写数据。默认动作为终止进程 (14) SIGALRM:定时器超时,超时的时间由系统调用 alarm 设置。默认动作为终止进程 (15) SIGTERM:程序结束信号,与 SIGKILL 不同的是,该信号可以被阳塞和终止。通常用来要示程序正常退出。执行 shell 命令 Kill 时,缺省产生这个信号。默认动作为终止进程 (16) SIGSTKFLT:Linux 早期版本出现的信号,现仍保留向后兼容。默认动作为终止进程 (17) SIGCHLD:子进程状态发生变化时,父进程会收到这个信号。默认动作为忽略这个信号 (18) SIGCONT:如果进程已停止,则使其继续运行。默认动作为继续 / 忽略 (19) SIGSTOP:停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为暂停进程 (20) SIGTSTP:停止终端交互进程的运行。按下 <ctrl+z> 组合键时发出这个信号。默认动作为暂停进程 (21) SIGTTIN:后台进程读终端控制台。默认动作为暂停进程 (22) SIGTTOU:该信号类似于 SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程 (23) SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带处数据到达,默认动作为忽略该信号 (24) SIGXCPU:进程执行时问超过了分配给该进程的CPU时间,系统产生该信号并发送给该进程。默认动作为终止进程 (25) SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程 (26) SIGVTALRM:虚拟时钟超时时产生该信号。类似于 SIGALRM,但是该信号只计算该进程占用 CPU 的使用时间。默认动作为终止进程 (27) SGIPROF:类似于 SIGVTALRM,它不公包括该进程占用 CPU 时间还包括执行系统调用时间。默认动作为终止进程 (28) SIGWINCH:窗口变化大小时发出。默认动作为忽略该信号 (29) SIGIO:此信号向进程指示发出了一个异步 IO 事件。默认动作为忽略 (30) SIGPWR:关机。默认动作为终止进程 (31) SIGSYS:无效的系统调用。默认动作为终止进程井产生 core 文件 (34) SIGRTMIN ~ (64) SIGRTMAX:LINUX 的实时信号,它们没有固定的含义(可以由用户自定义)。所有的实时信号的默认动作都为终止进程 二、kill函数/命令产生信号2.1 kill产生命令1、kill 命令产生信号:kill -SIGKILL pid kill?-SIGKILL -1 杀死所有的进程,电脑重启 2.2?kill函数1、kill 函数:给指定进程发送指定信号(不一定杀死) int kll(pid_t pid, int sig);? 成功:0;失败:?-1 (ID 非法,信号非法,普通用户杀 init 进程等权级问题),设置 errno sig:不推荐直接使用数字,应使用宏名,因为不同操作系统信号编号可能不同,但名称一致 pid>0:发送信号给指定的进程 pid=0:发送信号给与调用 kill 函数进程属于同一进程组的所有进程 pid<0:取 |pid| 发给对应进程组? pid=-1:发送给进程有权限发送的系统中所有进程 ? ?还可以使用其他的信号杀死进程 2.3 进程组:每个进程都属于一个进程组,进程组是一个或多个进程集合,他们相互关联,共同完成-一个实体任务,每个进程组都有一个进程组长,默认进程组ID与进程组长ID相同 2.4 权限保护:super 用户 (root) 可以发送信号给任意用户,普通用户是不能向系统用户发送信号的。kill -9 (root 用户的 pid)? 是不可以的。同样,普通用户也不能向其他普通用户发送信号,终止其进程。只能向自己创建的进程发送信号。普通用户基本规则是:发送者实际或有效用户 ID == 接收者实际或有效用户 ID 2.5?其他几个发送信号的函数int raise(int sig); void abort(void); 三、alarm 和 setitimer 函数3.1?alarm函数1、作用 设置定时器(闹钟)。在指定 seconds 后,内核会给当前进程发送 (14) SIGALRM 信号。进程收到该信号,默认动作终止 每个进程都有且只有唯一个定时器 2、unsigned int alarm(unsigned int seconds);? 返回 0 或剩余的秒数,无失败 3、常用: 取消定时器 alarm(0),返回旧闹钟余下秒数 4、案例: alarm(5)→3sec→alarm(4) →5sec →alarm(5) →alarm(0)? 调用 alarm(4) 返回 2,调用?alarm(5) 返回 0,调用?alarm(0) 返回 5 5、注意 定时,与进程状态无关(自然定时法)!就绪、运行、挂起(阻塞、暂停)、终止、僵尸... 无论进程处于何种状态,alarm 都计时 6、案例:一秒钟 for 循环的次数 (1) 基础版本 ? ? (2) 运行时候加上查看时间的内容 在用户空间(用户态)运行了 0.008 秒,再系统空间(核心态)运行了 0.873 秒 实际执行时间 = 系统时间 + 用户时间 + 等待时间 (3) 运行的内容写入文件 ? ? ?得出结论:优化 IO 能显著提高程序运行效率 ? 3.2 setitimer函数1、作用 设置定时器(闹钟) 可代替 alarm 函数。精度微秒 us,可以实现周期定时 2、int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); 成功:0;? ? 失败:-1,设置 errno 参数: (1) which: 指定定时方式。 ① 自然定时:ITIMER_REAL → (14) SIGLARM? ?计算自然时间(传入这个参数和上面的 alarm 函数的效果就是一样的) ② 虚拟空间计时(用户空间):ITIMER_VIRTUAL → (26) SIGVTALRM? ? 只计算进程占用 cpu 的时间 ③ 运行时计时(用户 + 内核):ITIMER_PROF → (27) SIGPROF? ? 计算占用 cpu 及执行系统调用的时间 (2) new_value:定时秒数 (3)?old_value:传出参数,上次定时剩余时间 (4) struct itimerval 结构体 ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 20:37:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |