A. linux系统下进程的信号(signal)处理流程是怎么样的
信号处理是Linux下进程管理的重要机制。信号的来源可分为三大类:硬件异常、外部信号和显示请求。
硬件异常产生的错误包括非法内存访问、除数为0等;外部信号则通过按键操作如Ctrl-C或定时器到期产生;显示请求则通常由`kill`函数触发。
在Linux中,每个进程由`task_struct`结构创建,包含`task vector`数组,其大小决定系统最大进程数,默认为512。`task_struct`中`Signal_Strct`包含`list_head`和`sigset_t`表,定义64种信号含义。
信号处理机制基于表存储,即每个进程都存有一张表,描述每种信号的意义。信号触发和发送是异步的,内核负责转发以确保安全,避免任意程序随意中止进程,如SIGSTOP和SIGKILL信号。
发送信号时,进程A根据信号表设置对应项。内核验证权限后更新B进程的信号表。信号处理没有排队机制,后续相同信号会被阻塞丢弃。内核发送中断请求给B进程,触发信号处理函数。信号处理后,B进程返回,再次设置frame,继续执行。
使用时,通过`kill`函数发送信号,接收进程调用`sighandler`或`signalaction`处理信号消息。此过程直观展示了Linux下进程信号处理的机制与流程。