STTNet 0.7.0

Demo:进程监督

可构建、可运行、可验证,并与仓库 examples 目录中的源码保持一致。

1. 示例内容

完整源码中的关键调用均有中文注释,页面同时给出运行命令、验证方法和可调整参数。

2. 构建与运行

cmake --build build --target sttnet_process_supervisor --parallel
./build/examples/sttnet_process_supervisor

3. 运行结果

./build/examples/sttnet_process_supervisor
预期:七秒内可以看到被监督的子进程被多次拉起。

4. 完整源码

#include <sttnet.h>

#include <chrono>
#include <iostream>
#include <thread>
#include <unistd.h>

int main()
{
    using stt::system::Process;

    // sec=2 会创建辅助进程,在目标退出两秒后重新拉起 Worker;
    // Linux 上辅助进程绑定当前父进程,父进程结束时也会停止。
    const bool started = Process::startProcess(
        [] {
            const char message[] = "supervised child ran once\n";
            // 这里使用 write(),因为子进程通过 _exit() 退出,
            // 不会刷新 C++ iostream 缓冲。
            ::write(STDOUT_FILENO, message, sizeof(message) - 1);
            std::this_thread::sleep_for(std::chrono::milliseconds(300));
        },
        2);

    if(!started)
    {
        std::cerr << "failed to create supervisor\n";
        return 1;
    }

    std::cout << "parent pid=" << ::getpid()
              << "; observe several child runs for seven seconds" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(7));

    // 这是进程监督,不是完整 daemonize:Process::startProcess() 不会
    // 调用 setsid()、切换工作目录或重定向标准 I/O。
    return 0;
}