在我的应用程序中,我需要启动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 client),它在进程列表中只有一个条目。有人能解释一下区别是什么吗?如果我做错了事情,我该怎么做?
请求的原因是我要求稍后停止udhcpd,似乎我需要停止使用childs pid(647)和从/var/run/udhcpd.pid(648)读取的pid。
最佳答案
我相信答案是udhcpd做了另一个叉子离开僵尸进程。恢复为只执行系统调用并使用pid文件中的pid终止进程。
关于c - Busybox udhcpd vfork启动两个进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36177998/