企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] ## 概述 系统存在的信号 ``` > man 7 signal SIGHUP 1 A 在控制终端上是挂起信号, 或者控制进程结束 SIGINT 2 A 从键盘输入的中断 SIGQUIT 3 C 从键盘输入的退出 SIGILL 4 C 无效硬件指令 SIGABRT 6 C 非正常终止, 可能来自 abort(3) SIGFPE 8 C 浮点运算例外 SIGKILL 9 AEF 杀死进程信号 SIGSEGV 11 C 无效的内存引用 SIGPIPE 13 A 管道中止: 写入无人读取的管道 SIGALRM 14 A 来自 alarm(2) 的超时信号 SIGTERM 15 A 终止信号 SIGUSR1 30,10,16 A 用户定义的信号 1 SIGUSR2 31,12,17 A 用户定义的信号 2 SIGCHLD 20,17,18 B 子进程结束或停止 SIGCONT 19,18,25 继续停止的进程 SIGSTOP 17,19,23 DEF 停止进程 SIGTSTP 18,20,24 D 终端上发出的停止信号 SIGTTIN 21,21,26 D 后台进程试图从控制终端(tty)输入 SIGTTOU 22,22,27 D 后台进程试图在控制终端(tty)输出 ``` ## 常用的信号 linux 下的常见信号 ``` SIGPIPE 管道中止,当写入无人读取的管道时产生该信号,默认终止进程 SIGCHLD 子进程结束或停止时发送 SIGALRM 定时器信号,以秒为单位,默认终止进程 SIGUSR1/SIGUSR2 自定义,在进程间传递信号,默认终止进程 SIGINT 键盘输入的退出信号 ,按键 Ctrl +\ 触发 SIGQUIT 键盘输入的退出信号,按键 Ctrl +c 触发 SIGHUP 控制终端的挂起信号 ``` ### SIGPIPE 网络程序必须要处理SIGPIPE信号,否则当客户端退出后,服务器仍然向该SOCKET发数据时,则会引起Crash ### SIGCHLD 僵尸进程是一个早已死亡的进程,但在进程表中仍占有位置 Linux中当子进程结束的时候,他并没有被完全销毁,因为父进程还要用它的信息 父进程没有处理SIGCHLD信号或调用wait/waitpid()等待子进程结束,就会出现僵尸进程 ## 实例 ### 简单实例 使用 signal ``` #include <iostream> #include <csignal> void sighandle(int sig) { std::cout << "receved signal " << sig << std::endl; } int main(int argc, char* argv[]) { signal(SIGINT, sighandle); signal(SIGQUIT, sighandle); pause(); return 0; } ``` 编译 ``` clang++ -std=c++11 -o test 1.cpp ``` 执行 ``` ./test // 按 Ctrl+C ^Creceved signal 2 ``` ### 使用 sigaction ``` #include <iostream> #include <csignal> void sighandle(int sig) { std::cout << "receved signal " << sig << std::endl; } int main(int argc, char* argv[]) { struct sigaction act, oact; act.sa_handler = sighandle; sigfillset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGINT, &act, &oact); pause(); return 0; } ``` 编译 ``` clang++ -std=c++11 -o test 1.cpp ``` 执行 ``` ./test // 按 Ctrl+C ^Creceved signal 2 ```