写点什么

Android C++ 系列:Linux 信号(一)

作者:轻口味
  • 2021 年 11 月 26 日
  • 本文字数:2867 字

    阅读完需:约 9 分钟

信号的概念

信号的编号

kill -l


kill -lHUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2
复制代码

信号机制

man 7 signal


Term Default action is to terminate the process.Ign Default action is to ignore the signal.Core Default action is to terminate the process and dump core (see core(5)). Stop Default action is to stop the process.Cont Default action is to continue the process if it is currently stopped.
复制代码


First the signals described in the original POSIX.1-1990 standard.


SignalSIGHUPSIGINT SIGQUIT SIGILL SIGABRT SIGFPE SIGKILL SIGSEGV SIGPIPESIGALRM SIGTERM SIGUSR1 SIGUSR2 SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOUValue Action1 Term2 Term 3 Core 4 Core 6 Core 8 Core 9 Term11 Core 13 Term14 Term15 Term 30,10,16 Term 31,12,17 Term 20,17,18 Ign 19,18,25 Cont 17,19,23 Stop 18,20,24 Stop 21,21,26 Stop 22,22,27 StopCommentHangup detected on controlling terminal or death of controlling process Interrupt from keyboardQuit from keyboardIllegal InstructionAbort signal from abort(3) Floating point exceptionKill signalInvalid memory referenceBroken pipe: write to pipe with no readersTimer signal from alarm(2) Termination signalUser-defined signal 1User-defined signal 2Child stopped or terminated Continue if stoppedStop processStop typed at ttytty input for background process tty output for background processThe signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
复制代码


表中第一列是各信号的宏定义名称,第二列是各信号的编号,第三列是默认处理动作:


  • Term 表示终止当前进程;

  • Core 表示终止当前进程并且 Core Dump(Core Dump 用于 gdb 调试);

  • Ign 表示忽略该信号;

  • Stop 表示停止当前进程;

  • Cont 表示继续执行先前停止的进程;


表中最后一列是简要介绍,说明什么条件下产生该信号。

信号产生种类

终端特殊按键


  • ctl+c SIGINT

  • ctl+z SIGTSTP

  • ctl+\ SIGQUIT


硬件异常


  • 除 0 操作

  • 访问非法内存


int kill(pid_t pid, int sig) pid > 0sig发送给ID为pid的进程 pid == 0sig发送给与发送进程同组的所有进程 pid < 0sig发送给组ID为|-pid|的进程,并且发送进程具有向其发送信号的权限 pid == -1sig发送给发送进程有权限向他们发送信号的系统上的所有进程 sig为0时,用于检测,特定为pid进程是否存在,如不存在,返回-1。
复制代码


kill 函数或 kill 命令 不过,kill 向调用者返回测试结果时,原来存在的被测试进程可能刚终 止


int raise(int sig) void abort(void)
复制代码


某种软件条件已发生 定时器 alarm 到时,每个进程只有一个定时器


 unsigned int alarm(unsigned int seconds)
复制代码


例:


#include <unistd.h> #include <stdio.h>int main(void) {  int counter;  alarm(1);  for(counter=0; 1; counter++)    printf("counter=%d ", counter);   return 0;}
复制代码


管道读端关闭,写端写数据

信号产生原因

  1. SIGHUP:当用户退出 shell 时,由该 shell 启动的所有进程将收到这个信号,默认动作为终止进程

  2. SIGINT:当用户按下了<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动 作为终止里程。

  3. SIGQUIT:当用户按下<ctrl+>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信 号。默认动作为终止进程。

  4. SIGILL:CPU 检测到某进程执行了非法指令。默认动作为终止进程并产生 core 文件

  5. SIGTRAP:该信号由断点指令或其他 trap 指令产生。默认动作为终止里程 并产生 core 文件。

  6. SIGABRT:调用 abort 函数时产生该信号。默认动作为终止进程并产生 core 文件。

  7. SIGBUS:非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生 core 文件。

  8. SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等所有的算法错误。默 认动作为终止进程并产生 core 文件。

  9. SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可 以杀死任何进程的方法。

  10. SIGUSE1:用户定义 的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。

  11. SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生 core 文件。

  12. SIGUSR2:这是另外一个用户自定义信号 ,程序员可以在程序中定义 并使用该信号。默认动作为终止进程。

  13. SIGPIPE:Broken pipe 向一个没有读端的管道写数据。默认动作为终止进程。

  14. SIGALRM:定时器超时,超时的时间 由系统调用 alarm 设置。默认动作为终止进程。

  15. SIGTERM:程序结束信号,与 SIGKILL 不同的是,该信号可以被阻塞和终止。通常用来要示程序正常退出。执行 shell 命令 Kill 时,缺省产生这个信号。默认动作为终止进程。

  16. SIGCHLD:子进程结束时,父进程会收到这个信号。默认动作为忽略这个信号。

  17. SIGCONT:停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为终止进程。

  18. SIGTTIN:后台进程读终端控制台。默认动作为暂停进程。

  19. SIGTSTP:停止进程的运行。按下<ctrl+z>组合键时发出这个信号。默认动作为暂停进程。

  20. SIGTTOU:该信号类似于 SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程。

  21. SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带外数据 到达,默认动作为忽略该信号。

  22. SIGXFSZ:进程执行时间超过了分配给该进程的 CPU 时间 ,系统产生该信号并发送给该进程。默认动作为终止 进程。

  23. SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程。

  24. SIGVTALRM:虚拟时钟超时时产生该信号。类似于 SIGALRM,但是该信号只计算该进程占用 CPU 的使用时间。默 认动作为终止进程。

  25. SGIPROF:类似于 SIGVTALRM,它不公包括该进程占用 CPU 时间还包括执行系统调用时间。默认动作为终止进 程。

  26. SIGWINCH:窗口变化大小时发出。默认动作为忽略该信号。

  27. SIGIO:此信号向进程指示发出了一个异步 IO 事件。默认动作为忽略。

  28. SIGPWR:关机。默认动作为终止进程。

  29. SIGSYS:无效的系统调用。默认动作为终止进程并产生 core 文件。

  30. SIGRTMIN~(64)SIGRTMAX:LINUX 的实时信号,它们没有固定的含义(可以由用户自定义)。所有的实时信 号的默认动作都为终止进程。

进程处理信号行为

manpage 里信号 3 种处理方式:


  • SIG_IGN

  • SIG_DFL

  • a signal handling function


进程处理信号的行为:


  1. 默认处理动作 term

  2. coregcc -g file.c

  3. ulimit -c 1024gdb a.out core 进程死之前的内存情况,死后验尸

  4. ign stop cont

  5. 忽略

  6. 捕捉(用户自定义信号处理函数)

信号集处理函数

sigset_t为信号集,可sizeof(sigset_t)察看int sigemptyset(sigset_t *set)int sigfillset(sigset_t *set)int sigaddset(sigset_t *set, int signo)int sigdelset(sigset_t *set, int signo)int sigismember(const sigset_t *set, int signo)
复制代码

总结

本文介绍了信号的编号,信号机制,信号产生的种类,信号产生的原因,以及进程处理信号的行为,信号集处理函数等。

发布于: 15 小时前阅读数: 6
用户头像

轻口味

关注

🏆2021年InfoQ写作平台-签约作者 🏆 2017.10.17 加入

Android、音视频、AI相关领域从业者。 邮箱:qingkouwei@gmail.com

评论

发布
暂无评论
Android C++系列:Linux信号(一)