linux信号

[Linux:]信号

送分小仙女□ 提交于 2020-02-17 05:15:31
1.如何理解信号 例如在生活中,快递员告诉我们快递到了,那么我们会终止手上的事,去取快递,这就是一种信号。 站在操作系统的角度,再来理解信号: 1.用户输入命令,在Shell下启动一个前台进程。 2. 用户按下 Ctrl-C ,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程 3. 前台进程因为收到信号,进而退出。 所以,显而易见,信号是操作系统与用户通信的一种方式,也可以是进程间通信的方式。 2. Linux下信号机制 信号是进程间时间异步通知的一种方式,属于软中断。 在Linux下我们可以使用 kill -l 命令查看系统定义的信号列表。 2.1 信号常见的处理方式 忽略此信号。 执行该信号的默认处理动作。 提供一个信号处理函数,要求内核在处理信号时切换到用户态执行这个处理函数,这种处理方式称之为捕捉一个信号。 2.2 产生信号的方式 通终端按键产生信号(如常用的Ctrl+z) 调用系统函数向进程发信号 由软件条件产生信号 硬件异常产生信号 3. Linux下信号阻塞 先来了解一些信号相关常见的概念: 信号递达(Delivery):实际执行信号的处理动作 未决信号(Pending):信号从产生到传递之间的状态。 阻塞信号(Blocking):被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 在内核中

Linux day7

守給你的承諾、 提交于 2020-02-16 19:38:20
信号 信号四要素: 编号 名称 事件 默认处理动作 – 终止 – 忽略 – 终止+产生core – 暂停、继续 信号的特点: 简单 不能携带大量信息 特定条件下产生 信号也叫软件产生的中断,有可能会有延迟 信号的处理方式: 默认执行动作 忽略 捕捉 9,19号不能捕捉,不能忽略,甚至不能阻塞 系统api产生信号 kill函数 int kill(pid_t pid,int sig) pid>0 ,要发送进程ID pid=0,代表当前调用进程组内所有进程 pid=-1,代表有权限发送的所有进程 pid<0 ,代表 pid对应的组内所有进程 sig对应的信号 raise 给自己发信号 int raise(int sig); 时钟信号 alarm 定时给自己发送SIGALRM 几秒后发送信号 返回值,上次闹钟剩余的描述 特别的,如果传入参数秒为0,代表取消闹钟 setitimer函数 周期性的发送信号 struct itimerval{ struct timeval it_interval;/ * interval for periodic timer * / 周期性的时间设置 struct timeval it_value; / * Time until next expiration * /下次的闹钟事件 } struct timeval{ time_t tv_sec; / *

linux系统相关的任务[fg、bg、jobs、&、ctrl + z]

淺唱寂寞╮ 提交于 2020-02-14 13:58:16
转自: http://blog.chinaunix.net/space.php?uid=20697318&do=blog&id=1891382 fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的 一。& 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 二。ctrl + z 可以将一个正在前台执行的命令放到后台,并且暂停 三。jobs 查看当前有多少在后台运行的命令 四。fg 将后台中的命令调至前台继续运行 如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) 五。bg 将一个在后台暂停的命令,变成继续执行 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) Linux下使用Shell命令控制任务Jobs执行 下列命令可以用来操纵进程任务:   ps 列出系统中正在运行的进程;   kill 发送信号给一个或多个进程(经常用来杀死一个进程);   jobs 列出当前shell环境中已启动的任务状态,若未指定jobsid,则显示所有活动的任务状态信息;如果报告了一个任务的终止

linux系统调用进程2信号

人盡茶涼 提交于 2020-02-06 22:37:44
1. 信号理论基础 **信号共性: 简单、不能携带大量信息、满足条件才发送 **信号的特质: 信号是软件层面上的"中断"。一旦型号产生,无论程序执行到什么位置,必须立即停止运行,处理信号,处理结束,在继续执行后续指令。 所有信号的产生以及处理全部都是有【内存】完成的 *** 信号产生 1. 按键产生,ctrl+z、ctrl+c 2. 系统调用产生, 如果kill 3. 软件条件产生, sleep 4. 硬件异常产生, 段错误、 段错误: 1. 访问了不是自己内存, 比如malloc自己申请了区域,访问malloc区域外了 2. 对只读区进行修改 char* ch="abc" ch[0]='a' 5.命令产生,比如kill命令 未决: 产生与递达之间状态 递达: 产生送到内核,直接被内核处理掉 信号处理方式: 默认、忽略、捕捉(自定义) linux内核进程控制块pcb是一个结构体,task_struct,除了包含进程id,状态,工作目录,用户id,组id,文件描述符表, 还包含信号相关信息,阻塞信号和未决信号 例子: 比如ctrl+c发送2号信号,那么未决信号集把第二位设置为1,那么内核发现第二未变成1了,处理2号信号,处理[默认、忽略、捕捉(自定义)]完毕第二位变成0 未决信号集把第二位设置为1 完毕第二位变成0 如果由于某种原因,把2号信号设置屏蔽,那么信号屏蔽字中2号变成1

linux指令-kill

南楼画角 提交于 2020-02-06 00:48:32
删除执行中的程序或工作,发送指定的信号到相应进程 不指定信号将发送 SIGTERM(15) 终止指定进程 用 "-KILL" 参数,发送信号 SIGKILL(9) 强制结束进程 常用参数: -l 信号,若果不加信号的编号参数,则使用"-l"参数会列出全部的信号名称 -a 当处理当前进程时,不限制命令名和进程号的对应关系 -p 指定 kill 命令只打印相关进程的进程号,而不发送任何信号 -s 指定发送信号 -u 指定用户 kill -l 显示信号 kill -KILL 8878 强制杀死进程 8878 kill -9 8878 彻底杀死进程 8878 kill -u tomcat 杀死 tomcat 用户的进程 【Java面试题与答案】整理推荐 基础与语法 集合 网络编程 并发编程 Web 安全 设计模式 框架 算法与数据结构 异常 文件解析与生成 Linux MySQL Oracle Redis Dubbo 来源: CSDN 作者: ConstXiong 链接: https://blog.csdn.net/meism5/article/details/104189083

linux 信号

我的梦境 提交于 2020-02-04 06:11:59
参考链接: 信号内容具体分析: http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html 信号的例子介绍: http://blog.csdn.net/jnu_simba/article/details/8947652 信号值位于SIGRTMIN和SIGRTMAX为可靠信号,也为实时信号,支持排队操作, 其余为非可靠信号。 信号的简单例子: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> void SigSendTestMail(int signo) { printf("get signal:%d\n", signo); } int main(int argc, char const *argv[]) { printf("SIGRTMIN val:%d\n", SIGRTMIN); struct sigaction act; act.sa_handler = SigSendTestMail; act.sa_flags = 0; sigemptyset(&act.sa_mask); sigaction(SIGRTMIN+10, &act, 0); act.sa_handler = SigSendTestMail;

Linux 信号signal

一笑奈何 提交于 2020-01-28 02:35:04
1 ctrl -c 只能给前台程序发送信号 而一个命令+& 表示将这个命令的进程放到后台运行,这样shell就不用等待就可以执行别的命令,启动新的进程。 2 shell可以运行一个前台进程和任意多的后台进程,但只有前台进程才能接收到类似于ctrl+c这种控制键产生的信号 3 前台进程运行中,用户可以随时用ctrl+c这样的控制键发送信号,也就是说,进程的用户空间代码执行到任何地方都有可能收到SIGINT信号而终止,所以 信号对于进程的控制流程来说是异步的。 kill -l查看信号清单 kill 7 signal 查看详细说明 信号处理方式 1 忽略 2 执行默认操作 3 提供一个信号处理函数,要求内核处理信号时,切换到用户态去执行相应的操作,这种方式称为捕捉(Catch)一个信号。 SIGINT默认是退出进程 SIGQUIT默认退出进程并core dump 什么是Core Dump? 进程异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘,文件名通常是core,这就叫Core Dump 即用户空间的内存数据。 然而进程异常终止常常是因为有bug,事后我们可以gdb bt 等 事后调试错误原油,进程允许产生多大的coredump 文件 这个信息保存在进程的PCB, 默认是不允许产生的,为什么 ? 因为可能会涉及到一些敏感信息,例如,用户的账户信息,密码,身份信息等

Linux课程设计报告【全集】

杀马特。学长 韩版系。学妹 提交于 2020-01-26 06:45:32
4个题目:进程创建及创建过程分析、进程族亲关系分析、进程间软中断通信、进程间管道通信 (欢迎评论/私信) 笔者用的是“ProcessOn免费在线作图网站”作的图。 报告格式要求:正文{中文:宋体、五号、单倍距;英文:Times New Roman、11号、单倍距} 一级标题{宋体、小三号、加粗} 二级标题{四号} 三级标题{小四} 不允许有四级标题 图命名{在图下方居中、宋体、五号、 仅允许出现2级图名 eg.3-1<空格>名称} 图中文字{宋体、小五} 表命名{在表上方居中、......} 表中文字{......} 页眉{学号<空格>姓名、宋体、小四、居中} 页脚{目录页码用罗马数字、正文页码用阿拉伯数字} 注* 参考文献格式要求、缩进要求 题目1 进程创建及创建过程分析 参看书P163~166 1.1设计目的 灵活运用fork系统调用创建进程,深入分析进程创建过程及fork系统调用返回值的含义,透彻分析父子进程代码共享、执行流程及数据集合的变化轨迹。 1.2设计要求 设计的程序能体现出父子进程执行轨迹的差别,也能体现出父子进程数据集合的差别。 1.3程序源代码 #include<stdio.h> #include<unistd.h> pid_t fork(void); int main() { printf("parent pid=%d\n",getpid()); pid_t

Linux信号(signal)机制

自作多情 提交于 2020-01-25 22:07:20
信号(signal)是一种软中断,信号机制是进程间通信的一种方式,采用异步通信方式 一、信号类型 Linux系统共定义了64种信号,分为两大类:可靠信号与不可靠信号,前32种信号为不可靠信号,后32种为可靠信号。 1.1 概念 不可靠信号: 也称为非实时信号,不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值取值区间为1~31; 可靠信号: 也称为实时信号,支持排队, 信号不会丢失, 发多少次, 就可以收到多少次. 信号值取值区间为32~64 1.2 信号表 在终端,可通过 kill -l 查看所有的signal信号 取值 名称 解释 默认动作 1 SIGHUP 挂起 2 SIGINT 中断 3 SIGQUIT 退出 4 SIGILL 非法指令 5 SIGTRAP 断点或陷阱指令 6 SIGABRT abort发出的信号 7 SIGBUS 非法内存访问 8 SIGFPE 浮点异常 9 SIGKILL kill信号 不能被忽略、处理和阻塞 10 SIGUSR1 用户信号1 11 SIGSEGV 无效内存访问 12 SIGUSR2 用户信号2 13 SIGPIPE 管道破损,没有读端的管道写数据 14 SIGALRM alarm发出的信号 15 SIGTERM 终止信号 16 SIGSTKFLT 栈溢出 17 SIGCHLD 子进程退出 默认忽略 18

Linux job control

只愿长相守 提交于 2020-01-24 15:48:00
Linux job control https://www.cnblogs.com/sparkdev/p/11980732.html Linux 系统中有一个 job control 的概念,本文简单介绍什么是 job,以及常见的 job control 命令。本文中演示部分使用的环境为 ubuntu 18.04。 进程组(job) 执行一个命令会创建一个或多个进程,这些进程被称为一个进程组(process group)。进程组中包含一个或多个进程,每个进程都会属于一个进程组,进程组也叫 job。 每个进程组都有一个领头进程(process group leader),领头进程的 PID 就是进程组的 ID(process group ID,PGID),我们可以通过 ps 命令查看进程的 PGID: $ ps -o pid,ppid,pgid,comm | cat 红框中的两个进程属于同一进程组(通过管道符连接的进程属于相同的进程组)。这个进程组中的领头进程为 16823,因此它的 PID 成了进程组的 PGID。我们可以通过下图来理解这几个进程之间的关系: 领头进程可以先退出,这时进程组依然存在并且 PGID 也不会发生变化。在进程组中的所有进程都退出后,进程组的证明周期结束。 将进程划分到进程组中的主要原因是可以对它们进行统一的管理,说白了就是同时发信号给组内的所有进程