Linux kill 进程后 ,fd 是否被释放,是否会调用 release ?

  1. kill 进程后怎么验证 fd 确实被释放了?
    打开 APP,使用 lsof 命令 确定我们被使用的APP 确实被打开了
xxxxxx:/ # lsof | grep video10
lsof | grep video10
camerahalserver  1695 cameraserv  mem       CHR               81,0                 7834 /dev/video10
camerahalserver  1695 cameraserv   18u      CHR               81,0       0t0       7834 /dev/video10

同样,关闭APP后,使用测试命令,结果如下

xxxxxx:/ # lsof | grep video10
lsof | grep video10

可以发现被打开的设备节点被关闭了,也就是释放了对应的 fd 。
下面 用 dev/binder 增加对应的 dump_stack() 来说明,由于使用的进程也打开了binder,在kill pid命令后,串口log如下

[  159.753908]<1>[W](1)[<ffffff80087a44d8>] binder_release+0xc8/0xd8
[  159.754666]<1>[W](1)[<ffffff80082194f4>] __fput+0x94/0x1d8
[  159.755348]<1>[W](1)[<ffffff8008219690>] ____fput+0xc/0x14
[  159.756031]<1>[W](1)[<ffffff80080cb318>] task_work_run+0xc0/0xe0
[  159.756779]<1>[W](1)[<ffffff80080ab644>] do_exit+0x2ac/0x984
[  159.757482]<1>[W](1)[<ffffff80080abd88>] do_group_exit+0x3c/0x98
[  159.758230]<1>[W](1)[<ffffff80080b9f68>] get_signal+0x3a0/0x564
[  159.758967]<1>[W](1)[<ffffff800808ae60>] do_signal+0x148/0x4cc
[  159.759693]<1>[W](1)[<ffffff800808b344>] do_notify_resume+0x84/0xa0
[  159.760473]<1>[W](1)[<ffffff8008083444>] work_pending+0x8/0x10
[  159.763496]<1>[I](1)init: Service 'camerahalserver' (pid 1674) received signal 15
[  159.764451]<1>[I](1)init: Sending signal 9 to service 'camerahalserver' (pid 1674) process group...
[  159.765813]<1>[I](1)libprocessgroup: Successfully killed process cgroup uid 1047 pid 1674 in 0ms

这里说明了两个方面内容:

  1. kill 进程后,进程中的fd会被释放,kernel 相应实现了 .release 的操作也会被调用
  2. fd 释放 是在 do_signal 即收到了 SIGTERM 实现了调用

引申:binder 服务的死亡通知就是通过 fd 释放会在 binder_release 实现了死亡通知

[   47.841435]<1>[W](1)Call trace:
[   47.841834]<1>[W](1)[<ffffff800808bb7c>] dump_backtrace+0x0/0x2c0
[   47.842590]<1>[W](1)[<ffffff800808c36c>] show_stack+0x14/0x1c
[   47.843303]<1>[W](1)[<ffffff80083cc078>] dump_stack+0x94/0xb4
[   47.844019]<1>[W](1)[<ffffff80087a85c8>] binder_release+0xac/0xbc
[   47.844777]<1>[W](1)[<ffffff80082194f4>] __fput+0x94/0x1d8
[   47.845456]<1>[W](1)[<ffffff8008219690>] ____fput+0xc/0x14
[   47.846141]<1>[W](1)[<ffffff80080cb318>] task_work_run+0xc0/0xe0
[   47.846889]<1>[W](1)[<ffffff80080ab644>] do_exit+0x2ac/0x984
[   47.847591]<1>[W](1)[<ffffff80080abd88>] do_group_exit+0x3c/0x98
[   47.848340]<1>[W](1)[<ffffff80080b9f68>] get_signal+0x3a0/0x564
[   47.849077]<1>[W](1)[<ffffff800808ae60>] do_signal+0x148/0x4cc
[   47.849802]<1>[W](1)[<ffffff800808b344>] do_notify_resume+0x84/0xa0
[   47.850581]<1>[W](1)[<ffffff8008083444>] work_pending+0x8/0x10
[   47.852451]<1>[I](1)binder: send failed reply for transaction 106838 to 1653:3145
[   47.853698]<1>[E](1)binder_alloc: 2695: binder_alloc_buf, no vma
[   47.854450]<1>[I](1)binder: 1653:3145 transaction failed 29189/-3, size 144-0 line 3136
[   47.855501]<1>[I](1)binder: undelivered transaction 106902, process died.
[   47.856353]<1>[I](1)binder: undelivered transaction 106830, process died.
[   47.857225]<1>[I](1)binder: send failed reply for transaction 106839 to 1653:3149
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值