launch_detached()

プロセスを親から切り離した状態(デタッチ)で起動するlaunch_detached()を実装しました。
差分


使い方はこんな感じで一発関数を呼ぶだけです。

#include <hamigaki/process/child.hpp>

namespace proc = hamigaki::process;

int main()
{
    // メモ帳を起動、終了は待たない
    proc::launch_detached("C:\\WINDOWS\\system32\\notepad.exe");
}

// プログラムが終了してもメモ帳は終了しない


Windows版のデタッチの実装は子プロセスのハンドルを閉じるだけです。
POSIXだと親プロセスは基本的に子プロセスの終了を待たないとダメなので、すこし面倒です。
単純に子プロセスの終了を無視すると、子プロセスは所謂ゾンビプロセスになります。
で、これを回避するには子プロセスを起動するときにfork()を2回呼びます。

// 概要のみ、エラーチェックなし

pid_t pid = ::fork();
if (pid == 0)
{
    pid_t pid = ::fork();
    if (pid == 0)
    {
        // 子プロセスBは何かをexec
        ::execve(...);
    }
    else
    {
        // 子プロセスAは終了
        ::_exit(0);
    }
}
else
{
    // 親プロセスは子プロセスAの終了を待つ
    ::wapitpid(pid, 0, 0);
}

子プロセスAは子プロセスBの終了を待っていませんが、親のいなくなったプロセスはinitプロセス(pid=1)に養子に出されるので問題ありません。
こういう仕組みなので、Windowsのように後でデタッチすることができなくて、デタッチ状態で起動するというインタフェースになっています。