私のアプリケーションでBusybox udhcpd(dhcp server)を起動する必要がありますが、そのコードは以下のとおりです。 udhcpdが起動して実行されている間に、プロセスリストに2つのバージョンがあります。 udhcpdが正しく動作しています。つまり、デバイスにIPアドレスが割り当てられています。Busybox udhcpd vforkは2つのプロセスを開始します
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で起動ログ出力
:今、私は/var/run/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
それは648のPIDを持ちます。コードの別の部分では、上記と同じコードを使用してdhcpcd(dhcp client)を起動し、プロセスリストには1つのエントリしかありません。誰もが違いが何であるかを説明することができますか、私は何をしなければならないものを間違ってやっている場合?
udhcpdを後で停止する必要があるため、pid(647)の子プロセスと/var/run/udhcpd.pid(648)のpidの両方の使用を停止する必要があるようです。
サービスのレイヤー。デーモンが起動すると(pid 647)、システムにインスタンスが表示され、システムの構成方法に応じて、必要に応じて追加のプロセスが開始されます。コードの別の部分で同様のインスタンスを起動すると、もう1つのプロセスが発生する可能性がありますが、デーモンの別のインスタンスは必要ありません。 'udhcpd'の別のインスタンスを起動するのに使ったとしても、あなたの'。/ MyApp'は既に実行中です。別のプロセスIDは必要ありません(pid 648) – ryyker
あなたの問題とは無関係ですが、実際に 'fork (任意のLinuxシステムで 'vfork()'ではなく) ''( '') 'vfork()'のLinuxマニュアルページQuoth: "Linuxがこの幽霊を過去から復活させたのは残念です。" –
Ryker、私が "私たちのコードの別の部分で私たちはdhcpdを始めました..."と書いたとき、私は "dhcpcd"(udhcpdではなく)を意味していました。私はudhcpdを上記のように1回だけ開始します。 – user6103938