Linux信号处理详解与应用

需积分: 9 1 下载量 19 浏览量 更新于2024-08-28 收藏 17KB TXT 举报
"Linux下Signal信号" 在Linux操作系统中,Signal信号是进程间通信的一种机制,用于传递异步事件的通知或强制执行特定操作。信号机制在处理异常情况、控制进程执行流程以及实现定时器等方面扮演着重要角色。信号是内核向进程发送的一种消息,可以中断进程的正常执行流程,使得进程能够对信号进行响应。 信号的分类主要有标准信号和自定义信号。标准信号是POSIX和Unix标准定义的一组预定义信号,如SIGHUP、SIGINT、SIGQUIT等,它们有固定的编号和默认行为。自定义信号则由用户程序创建,可以用来扩展系统功能。 1. SIGHUP(1):挂断信号,通常用于通知进程其控制终端已关闭。该信号的默认行为是终止进程,但某些守护进程可能会选择重新初始化。 2. SIGINT(2):中断信号,通常是用户按下Ctrl+C产生的,用于中断正在运行的命令或程序。默认情况下,这会导致进程终止。 3. SIGQUIT(3):退出信号,与SIGINT类似,但通常产生核心转储文件。 4. SIGILL(4):非法指令信号,当进程尝试执行非法指令时(例如,未定义的或损坏的代码段)发出。 5. SIGABRT(6):进程调用abort(3)函数时触发,表示程序内部错误,通常用于生成核心转储。 6. SIGFPE(8):浮点异常信号,当发生算术错误(如除以零或浮点溢出)时发出。 7. SIGKILL(9):杀进程信号,无法被捕获、忽略或重定向,用于强制立即终止进程。 8. SIGSEGV(11):段错误信号,进程尝试访问无效的内存地址时产生。 9. SIGPIPE(13):管道破裂信号,当进程试图向一个没有读取端的管道写入数据时触发。 10. SIGALRM(14):闹钟信号,由alarm(2)函数设置的定时器到期时发出。 11. SIGTERM(15):温和的终止信号,请求进程终止,进程可以选择优雅地清理资源后再退出。 12. SIGUSR1(30, 10, 16)和SIGUSR2(31, 12, 17):用户自定义信号1和2,供应用程序使用,定义自己的信号处理逻辑。 13. SIGCHLD(20, 17, 18):子进程结束或暂停时,父进程会收到此信号。默认情况下,系统不自动回收僵尸进程,需要父进程显式处理。 14. SIGCONT(19, 18, 25):继续信号,使停止的进程恢复执行。 15. SIGSTOP(17, 19, 23)和SIGTSTP(18, 20, 24):停止信号和终端停止信号,由键盘组合键(如Ctrl+Z)或系统命令(如kill -STOP)触发,不能被忽略或捕获。 16. SIGTTIN(21, 21, 26)和SIGTTOU(22, 22, 27):分别用于阻止后台进程的输入和输出操作,与终端设备相关。 17. SIGBUS(10, 7, 10):当进程访问的内存页不存在或损坏时触发,类似于SIGSEGV,但针对内存访问错误。 18. SIGPOLL(或SIGIO):与可读写事件相关的信号,通常与select(2)、poll(2)或epoll(7)等I/O多路复用函数配合使用。 每个信号都有其默认处理方式,例如,SIGINT默认是终止进程,而SIGCHLD默认是忽略。但通过使用signal(2)或sigaction(2)系统调用,可以改变这些默认行为,如捕获信号、忽略信号或执行自定义处理函数。此外,信号的处理必须遵循一定的规则,如信号的同步和异步问题,以及信号屏蔽的概念,以防止信号干扰程序的正常执行。 理解并熟练使用Linux下的Signal信号机制对于编写可靠且健壮的系统级程序至关重要。开发者可以通过信号来实现复杂的应用场景,如监控和控制进程状态、实现定时任务和异常处理等。