Android C++ 系列:Linux 信号(一)
信号的概念
信号的编号
kill -l
信号机制
man 7 signal
First the signals described in the original POSIX.1-1990 standard.
表中第一列是各信号的宏定义名称,第二列是各信号的编号,第三列是默认处理动作:
Term 表示终止当前进程;
Core 表示终止当前进程并且 Core Dump(Core Dump 用于 gdb 调试);
Ign 表示忽略该信号;
Stop 表示停止当前进程;
Cont 表示继续执行先前停止的进程;
表中最后一列是简要介绍,说明什么条件下产生该信号。
信号产生种类
终端特殊按键
ctl+c SIGINT
ctl+z SIGTSTP
ctl+\ SIGQUIT
硬件异常
除 0 操作
访问非法内存
kill 函数或 kill 命令 不过,kill 向调用者返回测试结果时,原来存在的被测试进程可能刚终 止
某种软件条件已发生 定时器 alarm 到时,每个进程只有一个定时器
例:
管道读端关闭,写端写数据
信号产生原因
SIGHUP:当用户退出 shell 时,由该 shell 启动的所有进程将收到这个信号,默认动作为终止进程
SIGINT:当用户按下了<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动 作为终止里程。
SIGQUIT:当用户按下<ctrl+>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信 号。默认动作为终止进程。
SIGILL:CPU 检测到某进程执行了非法指令。默认动作为终止进程并产生 core 文件
SIGTRAP:该信号由断点指令或其他 trap 指令产生。默认动作为终止里程 并产生 core 文件。
SIGABRT:调用 abort 函数时产生该信号。默认动作为终止进程并产生 core 文件。
SIGBUS:非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生 core 文件。
SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等所有的算法错误。默 认动作为终止进程并产生 core 文件。
SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可 以杀死任何进程的方法。
SIGUSE1:用户定义 的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。
SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生 core 文件。
SIGUSR2:这是另外一个用户自定义信号 ,程序员可以在程序中定义 并使用该信号。默认动作为终止进程。
SIGPIPE:Broken pipe 向一个没有读端的管道写数据。默认动作为终止进程。
SIGALRM:定时器超时,超时的时间 由系统调用 alarm 设置。默认动作为终止进程。
SIGTERM:程序结束信号,与 SIGKILL 不同的是,该信号可以被阻塞和终止。通常用来要示程序正常退出。执行 shell 命令 Kill 时,缺省产生这个信号。默认动作为终止进程。
SIGCHLD:子进程结束时,父进程会收到这个信号。默认动作为忽略这个信号。
SIGCONT:停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为终止进程。
SIGTTIN:后台进程读终端控制台。默认动作为暂停进程。
SIGTSTP:停止进程的运行。按下<ctrl+z>组合键时发出这个信号。默认动作为暂停进程。
SIGTTOU:该信号类似于 SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程。
SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带外数据 到达,默认动作为忽略该信号。
SIGXFSZ:进程执行时间超过了分配给该进程的 CPU 时间 ,系统产生该信号并发送给该进程。默认动作为终止 进程。
SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程。
SIGVTALRM:虚拟时钟超时时产生该信号。类似于 SIGALRM,但是该信号只计算该进程占用 CPU 的使用时间。默 认动作为终止进程。
SGIPROF:类似于 SIGVTALRM,它不公包括该进程占用 CPU 时间还包括执行系统调用时间。默认动作为终止进 程。
SIGWINCH:窗口变化大小时发出。默认动作为忽略该信号。
SIGIO:此信号向进程指示发出了一个异步 IO 事件。默认动作为忽略。
SIGPWR:关机。默认动作为终止进程。
SIGSYS:无效的系统调用。默认动作为终止进程并产生 core 文件。
SIGRTMIN~(64)SIGRTMAX:LINUX 的实时信号,它们没有固定的含义(可以由用户自定义)。所有的实时信 号的默认动作都为终止进程。
进程处理信号行为
manpage 里信号 3 种处理方式:
SIG_IGN
SIG_DFL
a signal handling function
进程处理信号的行为:
默认处理动作 term
coregcc -g file.c
ulimit -c 1024gdb a.out core 进程死之前的内存情况,死后验尸
ign stop cont
忽略
捕捉(用户自定义信号处理函数)
信号集处理函数
总结
本文介绍了信号的编号,信号机制,信号产生的种类,信号产生的原因,以及进程处理信号的行为,信号集处理函数等。
版权声明: 本文为 InfoQ 作者【轻口味】的原创文章。
原文链接:【http://xie.infoq.cn/article/ec681b2c58d98857397f8b1b5】。文章转载请联系作者。
评论