本文共 1136 字,大约阅读时间需要 3 分钟。
Linux 系统中,信号是操作系统用来报告进程状态改变或外部事件的机制。信号可以从程序、shell命令、系统限制或硬件事件触发。在 Linux 中,很多信号可以自定义处理,关键是要了解哪些信号不可被捕捉。
信号编号从 1 开始到 31 为普通信号,34 到 64 为实时信号。这些信号可以用于不同的操作,如终止(SIGTERM,15)、中断(SIGINT,2)、强制终止(SIGKILL,9)等。没有 0 号信号,因为这是用于测试进程的存在和权限的特殊信号。
kill
函数用于向进程发送信号。参数 pid
可以是特定的进程 ID、进程组 ID(小于 -1)、0(当前进程组)、-1(除自己外所有进程),根据错误条件设置错误码。例如:
#include#include #include int main() { signal(2, signal_handler); // 捕获 SIGINT 信号 kill(getpid(), SIGINT); sleep(1);}
使用 signal
函数注册处理函数,定义信号行为。例如,强制终止进程必须使用 kill -9
,无法自定义处理,因为这些信号是为了确保系统可靠性。
raise
函数向当前进程发送指定信号,常用于模拟用户操作如 Ctrl+C
。注意,某些信号如 SIGKILL
无法被调用。
abort
用于强制终止进程,发送 SIGABRT
信号。适用于不可恢复的错误情况,执行前不会清理资源,进程直接终止。
SIGFPE
:除以零错误。SIGSEGV
:无效指针访问。SIGALRM
:定时器触发。#include#include void signal_handler(int signum) { printf("Caught SIGALRM, count: %d\n", ++count); exit(0);}int main() { signal(14, signal_handler); alarm(1); while (true) { printf("Running pid: %d\n", getpid()); sleep(1); } return 0;}
文章结构清晰,逻辑连贯,适合搜索引擎优化,涵盖关键技术点,语言自然流畅。
转载地址:http://eswfk.baihongyu.com/