Cのバックグラウンドでプロセスをexec()するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1618756

  •  06-07-2019
  •  | 
  •  

質問

プロセスでforkとexec()を実行しましたが、バックグラウンドで実行したいです。これどうやってするの? waitpidを呼び出すのを避けることができますが、プロセスは永遠にそこに座って、親にステータスを返すのを待っています。これを行う他の方法はありますか?

役に立ちましたか?

解決

SIGCHLDをキャッチし、ハンドラーでwait()を呼び出します。

Posixのいくつかのフレーバー(* BSDと思いますが、そのことを引用しないでください)、SIGCHLDを無視すると、カーネルは自動的にゾンビプロセスをクリーンアップします(psで表示されるものです)。便利な機能ですが、移植性はありません。

他のヒント

あなたがやろうとしているのは、デーモンプロセスの作成だと思います。説明については、Wikipediaのこちらリンクを読んでください。

プロセスをデーモンにするための例(Unix環境でのスティーブンの高度なプログラミングによる)は次のとおりです。

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h> 

int daemon_int(void)
{
    pid_t pid;
    if ((pid = fork()) < 0)
        return (-1) ;
    else if (pid != 0)
       exit(0) ; /* The parent process exits */
    setsid() ;   /* become session leader */
    chdir("/") ; /* change the working dir */
    umask(0) ;   /* clear out the file mode creation mask */
    return(0) ;
}

もちろん、これはOSのようなUnixを想定しています。

プログラムには上記の関数が含まれており、実行されるとすぐに呼び出されます。その後、親プロセスから切り離され、終了するか強制終了されるまで実行を続けます。

waitpid(-1、&amp; status、WNOHANG)は必要なことを行う場合があります。子プロセスが終了していない場合は、すぐに戻る必要があります。または、SIGCHLDシグナルをリッスンすることもできます。

フォークしてバックグラウンドスレッドを作成し、実行します。このサイトでのduの質問を参照してください: &amp;を与えるexec()を使用してバックグラウンドプロセスを開始できますか?引数として?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top