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

·  阅读 201

「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战」。

信号的概念

信号的编号

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)
复制代码

总结

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

分类:
Android
标签:
分类:
Android
标签:
收藏成功!
已添加到「」, 点击更改