【发布时间】:2016-07-10 17:36:38
【问题描述】:
在我的应用程序中,我需要启动 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。
【问题讨论】:
-
服务层。一旦启动守护进程(您的 pid 647),系统会显示一个实例,然后根据系统的配置方式,根据需要启动其他进程。例如,在代码的另一部分启动类似的实例可能会导致多一个进程,但不需要另一个守护进程实例。你的
./MyApp已经在运行,不需要另一个进程 ID,即使你用它来启动另一个udhcpd实例(pid 648) -
这似乎与您的问题无关,但在任何 Linux 系统上确实应该使用
fork()而不是vfork()。引用vfork()的 Linux 手册页:“很不幸的是,Linux 从过去复活了这个幽灵。” -
Ryker,当我在上面写“在我们代码的另一部分中,我们启动 dhcpd ...”时,我的意思是“dhcpcd”(而不是 udhcpd)。如上所示,我只启动 udhcpd 一次。
标签: c linux exec busybox vfork