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

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

信号的概念


信号的编号


kill -l


kill -l
HUP 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.


Signal
SIGHUP
SIGINT SIGQUIT SIGILL SIGABRT SIGFPE SIGKILL SIGSEGV SIGPIPE
SIGALRM SIGTERM SIGUSR1 SIGUSR2 SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU
Value Action
1 Term
2 Term 3 Core 4 Core 6 Core 8 Core 9 Term
11 Core 13 Term
14 Term
15 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 Stop
Comment
Hangup detected on controlling terminal or death of controlling process Interrupt from keyboard
Quit from keyboard
Illegal Instruction
Abort signal from abort(3) Floating point exception
Kill signal
Invalid memory reference
Broken pipe: write to pipe with no readers
Timer signal from alarm(2) Termination signal
User-defined signal 1
User-defined signal 2
Child stopped or terminated Continue if stopped
Stop process
Stop typed at tty
tty input for background process tty output for background process
The 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 > 0
sig发送给ID为pid的进程 pid == 0
sig发送给与发送进程同组的所有进程 pid < 0
sig发送给组ID为|-pid|的进程,并且发送进程具有向其发送信号的权限 pid == -1
sig发送给发送进程有权限向他们发送信号的系统上的所有进程 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


core gcc -g file.c


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


ign stop cont


2.忽略


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


信号集处理函数


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)


总结


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

目录
相关文章
|
9月前
|
安全 Linux
【Linux】阻塞信号|信号原理
本教程从信号的基本概念入手,逐步讲解了阻塞信号的实现方法及其应用场景。通过对这些技术的掌握,您可以更好地控制进程在处理信号时的行为,确保应用程序在复杂的多任务环境中正常运行。
310 84
|
9月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
2087 77
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
627 1
Linux C/C++之IO多路复用(aio)
|
9月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
10月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
185 26
|
10月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
188 17
|
10月前
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
251 16
|
Java Linux Android开发
深入探索Android系统架构:从Linux内核到应用层
本文将带领读者深入了解Android操作系统的复杂架构,从其基于Linux的内核到丰富多彩的应用层。我们将探讨Android的各个关键组件,包括硬件抽象层(HAL)、运行时环境、以及核心库等,揭示它们如何协同工作以支持广泛的设备和应用。通过本文,您将对Android系统的工作原理有一个全面的认识,理解其如何平衡开放性与安全性,以及如何在多样化的设备上提供一致的用户体验。
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
2383 3
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
450 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库

热门文章

最新文章