2

在我的应用程序中,我需要启动 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,看来我需要停止使用孩子的 pid (647) 以及从 /var/run/udhcpd.pid (648) 读取的 pid。

4

1 回答 1

0

我相信答案是 udhcpd 做了另一个分支,留下了一个僵尸进程。恢复为仅执行系统调用并使用 PID 文件中的 PID 终止进程。

于 2016-03-24T16:07:14.770 回答