当前位置:   article > 正文

Linux——31个普通信号_linux31个信号

linux31个信号

每种信号的含义

Linux操作系统中,信号是一种进程间通信的方式,用于通知进程发生了某种事件。Linux中的普通信号(standard signals)有31个,每个信号都有特定的用途。以下是这31个普通信号的列表及其描述:

  1. SIGHUP (1): 挂起信号,通常在终端断开或关闭时发送给控制进程。
  2. SIGINT (2): 中断信号,通常由用户按下Ctrl+C键发送。
  3. SIGQUIT (3): 退出信号,通常由用户按下Ctrl+\键发送并生成核心转储。
  4. SIGILL (4): 非法指令,程序执行了非法或未定义的机器语言指令。
  5. SIGTRAP (5): 跟踪/断点陷阱,用于调试。
  6. SIGABRT (6): 异常终止,由abort()函数调用发送。
  7. SIGBUS (7): 总线错误,内存访问对齐错误。
  8. SIGFPE (8): 浮点异常,如除零或溢出。
  9. SIGKILL (9): 强制终止信号,不能被捕获或忽略,立即终止进程。
  10. SIGUSR1 (10): 用户定义信号1,应用程序可以自定义使用。
  11. SIGSEGV (11): 段错误,非法内存访问。
  12. SIGUSR2 (12): 用户定义信号2,应用程序可以自定义使用。
  13. SIGPIPE (13): 管道破裂,写入一个没有读取端的管道。
  14. SIGALRM (14): 闹钟信号,由alarm()函数设置的定时器到期时发送。
  15. SIGTERM (15): 终止信号,程序可以捕获该信号并执行清理操作。
  16. SIGSTKFLT (16): 协处理器堆栈错误(较少使用)。
  17. SIGCHLD (17): 子进程状态改变,当子进程终止或停止时发送给父进程。
  18. SIGCONT (18): 继续执行,如果进程已停止则恢复其执行。
  19. SIGSTOP (19): 停止执行,不能被捕获或忽略。
  20. SIGTSTP (20): 终端停止信号,通常由用户按下Ctrl+Z键发送。
  21. SIGTTIN (21): 后台进程尝试从终端读取时发送。
  22. SIGTTOU (22): 后台进程尝试向终端写入时发送。
  23. SIGURG (23): 紧急条件,套接字上有紧急数据可读。
  24. SIGXCPU (24): CPU时间限制超时。
  25. SIGXFSZ (25): 文件大小限制超时。
  26. SIGVTALRM (26): 虚拟定时器到期。
  27. SIGPROF (27): 统计定时器到期。
  28. SIGWINCH (28): 终端窗口大小改变。
  29. SIGPOLL (29): I/O操作事件(SysV定义)。
  30. SIGPWR (30): 电源故障。
  31. SIGSYS (31): 非法系统调用。

这些信号在编程和系统管理中有着重要的应用。通过使用信号,进程可以处理各种异常和特殊情况,实现更健壮和灵活的程序设计。

捕获SIGINT信号

SIGINT信号通常由用户按下Ctrl+C键发送。以下代码展示了如何捕获和处理SIGINT信号:

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <unistd.h>
  4. // 信号处理函数
  5. void handle_sigint(int sig) {
  6. printf("Caught signal %d (SIGINT)\n", sig);
  7. }
  8. int main() {
  9. // 注册信号处理函数
  10. signal(SIGINT, handle_sigint);
  11. // 无限循环,等待信号
  12. while (1) {
  13. printf("Running...\n");
  14. sleep(1);
  15. }
  16. return 0;
  17. }

编译并运行该程序后,当你按下Ctrl+C时,它将捕获SIGINT信号并调用handle_sigint函数。

捕获SIGTERM信号

SIGTERM信号通常用于请求进程终止。以下代码展示了如何捕获和处理SIGTERM信号:

 

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <unistd.h>
  4. // 信号处理函数
  5. void handle_sigterm(int sig) {
  6. printf("Caught signal %d (SIGTERM)\n", sig);
  7. // 进行清理工作
  8. printf("Cleaning up...\n");
  9. // 终止程序
  10. _exit(0);
  11. }
  12. int main() {
  13. // 注册信号处理函数
  14. signal(SIGTERM, handle_sigterm);
  15. // 无限循环,等待信号
  16. while (1) {
  17. printf("Running...\n");
  18. sleep(1);
  19. }
  20. return 0;
  21. }

编译并运行该程序后,可以通过以下命令发送SIGTERM信号:

kill -SIGTERM <pid>

其中,<pid>是程序的进程ID。

捕获SIGCHLD信号

SIGCHLD信号在子进程终止或停止时发送给父进程。以下代码展示了如何捕获和处理SIGCHLD信号:

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <unistd.h>
  4. #include <sys/wait.h>
  5. // 信号处理函数
  6. void handle_sigchld(int sig) {
  7. // 等待子进程终止
  8. wait(NULL);
  9. printf("Caught signal %d (SIGCHLD). Child process terminated.\n", sig);
  10. }
  11. int main() {
  12. // 注册信号处理函数
  13. signal(SIGCHLD, handle_sigchld);
  14. // 创建子进程
  15. pid_t pid = fork();
  16. if (pid == 0) {
  17. // 子进程代码
  18. printf("Child process running...\n");
  19. sleep(2);
  20. printf("Child process exiting...\n");
  21. _exit(0);
  22. } else {
  23. // 父进程代码
  24. printf("Parent process waiting for child to terminate...\n");
  25. // 无限循环,等待信号
  26. while (1) {
  27. sleep(1);
  28. }
  29. }
  30. return 0;
  31. }

编译并运行该程序后,子进程将在2秒后终止,父进程将捕获SIGCHLD信号并调用handle_sigchld函数。

两种不能被忽略的信号 

SIGKILL和SIGSTOP

两种不能被捕捉的信号

SIGKILL和SIGSTOP

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/959534
推荐阅读
相关标签
  

闽ICP备14008679号