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) |