Demo:进程监督
可构建、可运行、可验证,并与仓库 examples 目录中的源码保持一致。
1. 示例内容
完整源码中的关键调用均有中文注释,页面同时给出运行命令、验证方法和可调整参数。
2. 构建与运行
cmake --build build --target sttnet_process_supervisor --parallel
./build/examples/sttnet_process_supervisor3. 运行结果
./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;
}