2012-02-06 9 views
1

親プロセスはハングアップしません。親プロセスはデーモンであり、実行を継続する必要があります。フォークされたプロセスでwait()を実行すると、フォークされたexeclは実行されませんが、アプリケーションをハングアップさせます。C++フォーク、待機なし、defuncts execl

if((pid = fork()) < 0) 
    perror("Error with Fork()"); 
else if(pid > 0) { 
    //wait here will hang the execl in the parent 
    //dont wait will defunt the execl command 
    //---- wait(&pid); 
    return ""; 
} else { 
    struct rlimit  rl; 
    int     i; 

    if (rl.rlim_max == RLIM_INFINITY) 
     rl.rlim_max = 1024; 

    for (i = 0; (unsigned) i < rl.rlim_max; i++) 
     close(i); 

    if(execl("/bin/bash", "/bin/bash", "-c", "whoami", (char*) 0) < 0) perror("execl()"); 
    exit(0); 
} 

どのように私は待つ(& PID)EXECLのコマンドは文句を言わない亡きなしEXECLをフォークすることができますか?フォーク

signal(SIGCHLD, SIG_IGN); 

はまだ受け入れ答えに基づいて、より互換性のあるソリューションで私の限られたスキルを使用する前に、以下を追加することにより、固定

UPDATE 。ありがとう!

答えて

5

デフォルトでは、waitとプロセスが終了するまで友だちが待ってからそれを刈り取ります。 WNOHANGwaitpidと電話すると、出席していない子供がいない場合にすぐに戻ることができます。

無効な「ゾンビ」プロセスは、waitまで周りに座ります。あなたがバックグラウンドで実行するのであれば、あなたはいくつかの方法のいずれかによって、最終的にそれを享受するために手配しなければなりません:

  • 日常WNOHANGwaitpidを試してみてください。int pid = waitpid(-1, &status, WNOHANG)
  • は、それが終了したときに通知されるようにSIGCHLDのためのシグナルハンドラをインストールします

また、POSIX.1-2001の下で、あなたはsigactionSIGCHLDSA_NOCLDWAITを設定することができます。または、アクションをSIG_IGNに設定します。古いシステム(Linux 2.4.xを含むが、2.6.xや3.xは含まない)はこれをサポートしていません。

システムマンページを確認するか、またはwait in the Single Unix Specificationを確認してください。 Single Unix Specは役に立つコード例も示しています。 SA_NOCLDWAITsigactionに記載されています。

+0

最も簡単な解決策はシグナル(SIGCHLD、SIG_IGN)を追加することでした。私のフォークの前に、私は限られたスキルを超えているような他のオプションをほとんど試しました。人々が2.4.xを使いたい場合に備えて、私は引き続き試してみます。 –

0

シグナルハンドラは、表示されているように最善の方法だと思います。私はこれを扱う別の方法を指摘したいと思います:フォークは2回あり、孫がexeclに電話をかけている間に子供を退出させてください。無効なプロセスはinitプロセスによってクリーンアップされます。

+0

私は二重フォークを試して、それは私の状況で何らかの理由で動作しませんでした。二重フォークは私が持っていたスタックの別の質問でも推奨されましたが、一般的にこれを行うには最適な方法ではないと一般に感じました –

+0

私はシグナルハンドラが優れていると思うのですが、 –

関連する問題