POSIX 信号处理函数里为什么不能随意 printf、malloc 或加锁?
信号可能在任意指令点打断当前线程,许多库函数持有内部锁或修改全局状态,重入会死锁或破坏数据。Handler 只能调用异步信号安全函数,常见做法是设置 sig_atomic_t 标志或写 Self-Pipe/Eventfd 通知主循环。
Question Bank
按知识、方向与难度筛选;每道题都有分层回答和工程追问。
信号可能在任意指令点打断当前线程,许多库函数持有内部锁或修改全局状态,重入会死锁或破坏数据。Handler 只能调用异步信号安全函数,常见做法是设置 sig_atomic_t 标志或写 Self-Pipe/Eventfd 通知主循环。
Runtime PM 在系统运行时按设备空闲状态独立关电/关钟,系统 Suspend 则协调全机进入睡眠。驱动需维护 usage count、autosuspend 和依赖关系,并在回调中保存/恢复必要上下文,阻止 I/O 与断电竞争。
TCP Keepalive 在连接长时间空闲后探测对端网络栈是否可达,默认周期往往很长;应用心跳可按业务 SLA 验证服务线程、会话和端到端响应,还能携带序列与状态。两者可组合但不能替代请求超时。
三次握手让双方同步初始序号并确认双向可达;全双工连接的两个方向独立关闭,因此正常释放常见四个报文;主动关闭方进入 TIME_WAIT,等待旧报文消失并能重发最后 ACK。
socket 创建端点,bind 绑定本地地址端口,listen 让它成为监听 Socket 并设置排队提示,accept 从已完成连接队列取出一个新的已连接 Socket;监听 Socket 继续负责接收新连接。
环境区保存 bootcmd、启动参数等可变配置,CRC 或格式损坏时 U-Boot 通常回退默认环境。冗余环境使用两个副本和有效/序列状态,在掉电更新中选择最后完整版本,但仍需限制写频率和保护安全变量。
广播面向一个二层/子网广播域内所有主机,组播面向加入特定组的接收者并由网络设备按组转发。接收端需在指定接口加入组,发送端还要考虑 TTL、回环和多网卡出口。UDP 本身不保证送达和顺序。