process_flag(trap_exit, true)

探讨了Erlang中使用特定函数后进程无法被正常杀死的现象,尤其是在由supervisor启动的gen_server进程中,即使尝试通过supervisor进行杀死也不会收到预期的退出消息,而是直接进入terminate函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

erlang进程用了这个函数后,再用exit(Pid,Reason),就不能再杀死进程了(除非Reason=kill),但会发{‘EXIT’, From, Reason}给Pid进程

问题

在有supervisor启动的gen_server进程,由supervisor进程去杀死gen_server进程时,却不会收到信息,而是直接走terminate函数

结论

原来这是erlang官方的特殊设定
这里写图片描述
详见 http://erlang.org/doc/man/gen_server.html#Module:terminate-2

### do_freezer_trap 的 Linux Kernel 实现与解释 `do_freezer_trap` 是 Linux 内核中的一个重要函数,主要用于处理进程冻结机制。它通常用于支持休眠(suspend)或挂起操作,在这些场景下需要暂停某些用户空间线程以确保系统的状态可以被安全保存。 #### 函数的功能描述 该函数的核心作用是检测当前调用它的线程是否应该进入冻结状态。如果条件满足,则会阻塞此线程直到其被解冻[^1]。这种行为对于实现系统级的低功耗模式至关重要,因为它能够防止特定类型的线程干扰到核心功能的操作流程。 以下是 `do_freezer_trap` 的典型应用场景及其逻辑分解: 1. **判断线程是否可冻结** 如果当前线程设置了 `PF_FREEZER_SKIP` 标志位或者属于不可冻结类别(如实时优先级任务),则不会触发任何进一步的动作[^2]。 2. **检查全局冻结标志** 当整个系统处于冻结过程中时,内核会设置相应的全局变量来指示这一状态。此时,所有符合条件的线程都将尝试加入等待队列并进入睡眠状态[^3]。 3. **唤醒机制** 随着冻结过程结束,管理模块负责遍历受影响的任务列表,并逐一解除它们的停滞状况以便恢复正常运行[^4]。 #### 示例代码片段 下面展示了一个简化版的伪代码表示形式,帮助理解其实现细节: ```c void do_freezer_trap(void) { struct task_struct *tsk = current; if (unlikely(frozen(tsk))) { // 判断是否已被标记为需冻结 set_current_state(TASK_UNINTERRUPTIBLE); // 修改线程状态至不可中断型睡眠 spin_lock(&freezer_lock); list_add_tail(&tsk->frozen_list, &frozen_tasks_head); // 加入冻结链表头节点 spin_unlock(&freezer_lock); schedule(); // 主动让出CPU资源直至收到信号重新激活 __set_current_state(TASK_RUNNING); // 恢复正常执行态 remove_from_frozen_list(tsk); // 移除自身记录以防重复处理 } } ``` 以上代码仅为示意性质,实际源码可能更加复杂且包含额外的安全防护措施以及性能优化手段。 #### 技术背景补充说明 Linux 内核提供了多种方法用来控制不同层次上的活动单元——从单独设备驱动程序里的硬件组件切换到高层次的应用层服务调度策略调整不等。而像 `do_freezer_trap` 这样的工具正是为了协调跨多个抽象级别的协作需求所设计出来的解决方案之一[^5]。 通过这种方式不仅可以有效减少能源消耗还能提高整体稳定性特别是在面对突发异常情况的时候展现出强大的恢复能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值