900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > linux signal11 Linux Signal

linux signal11 Linux Signal

时间:2020-10-27 13:53:35

相关推荐

linux signal11 Linux Signal

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

信号本质

软终端信号(signal,又简称未信号)在软件层次上对中断机制的一种模拟,是进程间通信机制中唯一的异步通信机制。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。

收到信号的进程对各种信号处理方法可以分为三类:

第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。

第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。

第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。

使用kill -l就会显示出linux支持的信号列表,编号1~31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),值小于 SIGRTMIN

编号32~63的信号是拓展,称为可靠信号(实时信号),值位于 SIGRTMIN 与 SIGRTMAX 之间信号值小于 SIGRTMIN 的信号都是不可靠信号

不可靠信号和可靠信号的区别在于前者不支持排队,可能造成信号丢失

信号说明SIGHUP😇

本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业。登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载。此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件SIGINT😇

程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程

SIGQUIT 😇

和SIGINT类似,但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 类似于一个程序错误信号。

SIGILL

执行非法指令,通常是因为可执行文件本身出现错误, 或试图执行数据段. 堆栈溢出时也有可能产生这个信号。

SIGTRAP

由断点指令或其它trap指令产生. 由debugger使用。

SIGABRT

调用 abort(3) 函数生成的信号。

SIGBUS 😇

非法地址, 包括内存地址对齐(alignment)出错。比如访问一个四个字长的整数, 但其地址不是4的倍数。与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。

SIGFPE

在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。

SIGKILL 😇

用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果发现某进程终止不了,可尝试发送此信号。

SIGUSR1

留给用户使用

SIGSEGV 😇

试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.信号 11,即表示程序中可能存在特定条件下的非法内存访问

SIGUSR2

留给用户使用

SIGPIPE😇

管道破裂。通常在进程间通信产生。比如:用FIFO(管道)通信的两个进程,读管道没打开或意外终止就往管道写,写进程会收到SIGPIPE信号。

此外用Socket通信的两个进程,写进程在写Socket的时候,读进程已经终止。

SIGALRM

时钟定时信号,计算的是实际的时间或时钟时间。alarm函数使用该信号。

SIGTERM

程序结束(terminate)信号, 通常用来要求程序自己正常退出。与SIGKILL不同的是该信号可以被阻塞和处理。shell命令kill缺省产生这个信号。如果进程终止不了,才会尝试SIGKILL。

SIGCHLD 😇

子进程结束时, 父进程会收到这个信号。如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。

解决办法:父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管)。SIGCONT 😇

让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符

SIGSTOP 😇

停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

SIGTSTP 😇

停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

SIGTTIN

当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.

SIGTTOU

类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.

SIGURG

有”紧急”数据或out-of-band数据到达socket时产生。

SIGXCPU 😇

超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变。

SIGXFSZ

当进程企图扩大文件以至于超过文件大小资源限制。

SIGVTALRM

虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.

SIGPROF

类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.

SIGWINCH

窗口大小改变时发出.

SIGIO😇

文件描述符准备就绪, 可以开始进行输入/输出操作.

SIGPWR

电力故障

SIGSYS

非法的系统调用

以上信号中:程序不可捕获、阻塞或忽略的信号:SIGKILL SIGSTOP

不能恢复至默认动作的信号:SIGILL SIGTRAP

默认会导致进程流产的信号:SIGABRT SIGBUS SIGFPE SIGILL SIGIOT SIGQUIT SIGSEGV SIGTRAP SIGXCPU SIGXFSZ

默认会导致进程退出的信号:SIGALRM SIGHUP SIGINT SIGKILL SIGPIPE SIGPOLL SIGPROF SIGSYS SIGTERM SIGUSR1 SIGUSR2 SIGVTALRM

默认会导致进程停止的信号:SIGSTOP SIGTSTP SIGTTIN SIGTTOU

默认进程忽略的信号:SIGCHLD SIGPWR SIGURG SIGWINCH

此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;

SIGCONT在进程挂起时是继续,否则是忽略,不能被阻塞

终止程序的时候在不得已的情况下不能用SIGKILL,因为SIGKILL不会对子进程进行处理,只是把对自己进行处理

信号速查表信号取值默认动作含义(发出信号的原因)SIGNUP1Term终端的挂掉或进程死掉

SIGINT2Term来自键盘的终端信号

SIGQUIT3Core来自键盘的离开信号

SIGILL4Core非法指令

SIGTRAP5

SIGABRT6Core来自abort的异常

SIGIOT6

SIGBUS7

SIGEMT-

SIGFPE8Core浮点例外

SIGKILL9Term杀死

SIGUSR110

SIGUSEGV11Core段非法错误(内存引用无效)

SIGUSR212

SIGPIPE13Term管道损坏:向一个没有读进程的管道写数据

SIGALRM14Term来自alarm的计时器到时信号

SIGTERM15Term终止

SIGSTKFLT16

SIGCHLD17Ign子进程终止活停止

SIGCLD-

SIGCONT18Cont如果停止,继续执行

SIGSTOP19Stop非来自终端的停止信号

SIGTSTP20Stop来自终端的停止信号

SIGTTIN21Stop后台进程读终端

SIGTTOU22Stop后台进程写终端

SIGURG23Ign跟踪/断点自陷

SIGXCPU24Core超过CPU时限

SIGXFSZ25Core超过文件长度限制

SIGVTALRM26Term虚拟计时器到时

SIGPROF27

SIGWINCH28Ign窗口大小改变

SIGIO29Term文件描述符准备就绪,可以进行I/O操作

SIGPOLL

SIGPWR30Term电力故障(System V)

SIGINFO-与SIGPWR同义

SIGLOST-Term文件锁丢失

SIGSYS31

SIGUNUSED31Term未使用信号(will be SIGSYS)

默认动作:Term 终止进程

Ign 忽略信号

Core 缺省的动作是终止进程并进行内核映像转储(dump core)内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做可以得到进程当时执行时的数据值,方便确定转储的原因,且可以调试程序。

Stop 缺省的动作是停止进程,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调用)

Cont 如果进程停止则继续进程

信号应用

信号的处理流程

一个完整的信号声明周期(从信号发送到相应的处理函数执行完毕),可以分为三个阶段信号诞生

信号在进程中注册

信号再执行和注销

信号的诞生

信号事件的发生有两个来源:硬件来源,比如按下键盘或者其它硬件故障;

软件来源,常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。

按发出信号的原因简单分类,以了解各种信号:与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。

与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。

与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。

与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。

在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。

与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。

跟踪进程执行的信号。

思考与问题SIGBUS 与 SIGSEGV的区别

僵尸进程

内存进程表

进程的状态变化

信号23具体指?

信号18/19/20具体的区别

Abort(3)函数

参考资料

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。