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)


总结


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

目录
相关文章
|
2月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
97 0
|
2月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
102 1
Linux C/C++之IO多路复用(aio)
|
1月前
|
Java Linux Android开发
深入探索Android系统架构:从Linux内核到应用层
本文将带领读者深入了解Android操作系统的复杂架构,从其基于Linux的内核到丰富多彩的应用层。我们将探讨Android的各个关键组件,包括硬件抽象层(HAL)、运行时环境、以及核心库等,揭示它们如何协同工作以支持广泛的设备和应用。通过本文,您将对Android系统的工作原理有一个全面的认识,理解其如何平衡开放性与安全性,以及如何在多样化的设备上提供一致的用户体验。
|
2月前
|
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开发知识可参考相关书籍。
108 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
452 3
|
2月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
33 0
Linux C/C++之线程基础
|
2月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
34 0
Linux C/C++之IO多路复用(poll,epoll)
|
2月前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
45 0
Linux C/C++之TCP / UDP通信
|
2月前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
38 0
Linux c/c++之IPC进程间通信
|
Android开发
Android系统移植与调试之-------&gt;如何修改Android手机显示的4G信号强度的格子数
           在修改显示的信号强度之前,先了解一下什么是dB,什么是dBm? 1.dB   dB是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时, 按下面的计算公式:10log(甲功率/乙功率),如果采用两者的电压比计算,要用20log(甲电压/乙电压)。
1617 0