在我的应用程序中,我需要启动Busybox udhcpd(dhcp服务器),代码如下。当udhcpd启动并运行时,我在进程列表中得到两个版本。 udhcpd正常运行,即为设备分配了IP地址。
pid_t forked_pid = vfork();
if ( forked_pid == 0 )
{
// Child process, execute udhcpd.
execl( "/usr/bin/udhcpd",
"udhcpd",
"/var/run/udhcpd.conf", // the location of the udhcpd config file
NULL );
}
else if ( forked_pid > 0 )
{
// Parent process, record the childs pid
m_udhcpd_pid = forked_pid;
log( Log_Info, "UDHCPD started with PID: %d (PID=%d)", forked_pid, getpid());
}
else
{
log( Log_Warning, "Failed to start UDHCPD" );
}
日志输出
UDHCPD以PID开始:647(PID = 528)
PS输出
528 root 0:03 ./MyApp
647 root 0:00 [udhcpd]
648 root 0:00 udhcpd /var/run/udhcpd.conf
现在,如果我查看/var/run/udhcpd.pid,它的pid为648.在我们的代码的另一部分,我们使用与上面相同的代码启动dhcpcd(dhcp客户端),它只有一个条目进程列表。任何人都可以解释有什么区别,如果我做错了我应该做的事情吗?
询问的原因是我需要稍后停止udhcpd,似乎我需要停止使用childs pid(647)以及从/var/run/udhcpd.pid(648)读取的pid。
答案 0 :(得分:0)
我相信答案是udhcpd做了另一个离开僵尸进程的分叉。恢复为仅使用PID文件中的PID进行系统调用并终止进程。