Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188634
  • 博文数量: 20
  • 博客积分: 543
  • 博客等级: 下士
  • 技术积分: 411
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-06 20:38
文章存档

2012年(12)

2009年(8)

分类: 嵌入式

2012-09-21 21:07:39

1. 启动wpa_supplicant时产生僵尸进程
wpa_supplicant 是提供WIFI服务的一个守护进程,我们需要根据用户在UI上的操作来启动或停止 wpa_supplicant进程,为此写了个C函数来启动wpa_supplicant. 该C函数采用经典的 fork + exec 方式。
发生的异常现象是:调用该函数后,用ps命令发现系统中有两个wpa_supplicant进程,其中一个为Zombie状态。
想到僵尸进程产生的原因是子进程退出而父进程没有waitpid,则可以猜测wpa_supplicant内部又进行了fork。
查看代码,果然wpa_supplicant会进行fork等操作而使自己变成一个Daemon进程,从而留下了一个Zombie进程。
解决的办法:在启动wpa_supplicant的函数里增加一个waitpid调用即可。

2. Android里dhcpcd的启动
Android里面的init进程会负责启动dhcpcd,在启动成功后设置init.sv.dhcpcd_wlan0的值为running状态,从而上层的Java代码(如dhcpStateMache)便知道dhcpcd启动成功。
init进程用fork + exec的方式启动dhcpcd, 而在默认的参数下,dhcpcd内部又会进行fork.  这样导致 init进程认为dhcpcd异常退出,从而设置init.sv.dhcpcd_wlan0 为stop状态, 使dhcpStateMache等待 running超时, 认为不能获取IP。
解决办法:启动dhcpcd时加参数使它不进行daemonize.

阅读(2360) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~