2016-03-23 3 views
2

私のアプリケーションで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の両方の使用を停止する必要があるようです。

+0

サービスのレイヤー。デーモンが起動すると(pid 647)、システムにインスタンスが表示され、システムの構成方法に応じて、必要に応じて追加のプロセスが開始されます。コードの別の部分で同様のインスタンスを起動すると、もう1つのプロセスが発生する可能性がありますが、デーモンの別のインスタンスは必要ありません。 'udhcpd'の別のインスタンスを起動するのに使ったとしても、あなたの'。/ MyApp'は既に実行中です。別のプロセスIDは必要ありません(pid 648) – ryyker

+0

あなたの問題とは無関係ですが、実際に 'fork (任意のLinuxシステムで 'vfork()'ではなく) ''( '') 'vfork()'のLinuxマニュアルページQuoth: "Linuxがこの幽霊を過去から復活させたのは残念です。" –

+0

Ryker、私が "私たちのコードの別の部分で私たちはdhcpdを始めました..."と書いたとき、私は "dhcpcd"(udhcpdではなく)を意味していました。私はudhcpdを上記のように1回だけ開始します。 – user6103938

答えて

0

udhcpdがゾンビプロセスを残す別のフォークを実行していると私は考えています。システムコールをやり直し、PIDファイルのPIDを使用してプロセスを強制終了します。

関連する問題