在Linux系统中,信号是一种非常重要的进程间通信机制,它本质上是一种软件中断,用来通知进程发生了某个事件。想象一下,你在终端中运行一个程序,按下 Ctrl+C 就能终止它,这个操作就是通过发送 SIGINT 信号实现的。本文将带领大家深入理解Linux信号,从基础概念到常用函数(kill函数、abort函数、raise函数、alarm函数),帮助小白也能轻松掌握信号处理。
信号是Linux/Unix系统中用于进程间异步通知的一种机制。每个信号都有一个唯一的编号和名称(如 SIGINT、SIGKILL)。当进程收到信号时,它可以采取三种处理方式:默认操作(通常是终止进程)、忽略信号、或者捕获信号并执行自定义函数。信号与硬件中断类似,都是由操作系统内核代为处理并传递给目标进程。
SIGINT (2):终端中断符(Ctrl+C),默认终止进程。SIGQUIT (3):终端退出符(Ctrl+\),默认终止并生成core文件。SIGKILL (9):强制终止进程,不可被捕获或忽略。SIGTERM (15):终止信号,可被捕获,用于正常结束程序。SIGALRM (14):由alarm函数设置的定时器超时时产生。信号可以由多种方式产生:• 键盘事件:如 Ctrl+C 产生SIGINT,Ctrl+\ 产生SIGQUIT。• 硬件异常:如除零错误产生SIGFPE,非法内存访问产生SIGSEGV。• 软件条件:如通过alarm函数设置定时器,超时后产生SIGALRM。• 命令或函数调用:使用 kill 命令或 kill函数、raise函数、abort函数显式发送信号。
#include #include int kill(pid_t pid, int sig); kill函数用于向指定进程(或进程组)发送信号。参数 pid 表示目标进程ID,sig 是要发送的信号编号。成功返回0,失败返回-1。例如,kill(1234, SIGTERM) 向PID为1234的进程发送终止信号。
#include int raise(int sig); raise函数等价于 kill(getpid(), sig),即向调用进程自身发送信号。常用于在程序内部触发信号处理逻辑。例如,raise(SIGUSR1) 向自己发送用户自定义信号。
#include void abort(void); abort函数向当前进程发送 SIGABRT 信号,导致进程异常终止并生成core文件(如果允许)。它通常用于程序遇到致命错误时调用。
#include unsigned int alarm(unsigned int seconds); alarm函数用于设置一个定时器,在指定的秒数后向进程发送 SIGALRM 信号。如果之前已设置定时器,则返回剩余时间。常用于实现超时控制或周期性任务。例如,alarm(5) 表示5秒后发送SIGALRM信号。
#include #include #include void handler(int sig) { printf("收到信号 %d,定时器超时!", sig);}int main() { signal(SIGALRM, handler); // 捕获SIGALRM alarm(3); // 3秒后触发 printf("等待3秒..."); pause(); // 挂起进程直到收到信号 return 0;} 该程序先注册SIGALRM的处理函数,然后设置3秒定时器,调用pause等待信号。当alarm超时后,内核发送SIGALRM,处理函数被执行,输出信息。
• 信号是异步的,处理函数中应避免调用不可重入函数。• SIGKILL 和 SIGSTOP 不可被捕获或忽略。• 使用kill函数时需确保有权限向目标进程发送信号。• alarm函数设置的定时器不会重复,如需周期性定时需重新设置。• abort函数产生的SIGABRT如果被捕获,处理函数返回后进程仍会终止。
—— 本文核心关键词:Linux信号、kill函数、abort函数、alarm函数 ——
本文由主机测评网于2026-03-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:http://www.vpshk.cn/20260330341.html