STTNet 0.7.0

Demo:信号与优雅退出

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

1. 示例内容

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

2. 构建与运行

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

3. 运行结果

启动程序并访问 /ping,然后执行 kill -TERM <pid>。
预期:/ping 返回 pong;收到终止信号后,服务完成优雅关闭并以 0 退出。

4. 完整源码

#include <sttnet.h>

#include <csignal>
#include <iostream>

int main()
{
    using namespace stt::network;
    using stt::system::ServerSetting;

    // 配置 STTNet 安全的进程级信号默认行为。
    // 其中会忽略 SIGPIPE,避免已关闭 socket 终止进程。
    ServerSetting::setExceptionHandling();

    // 在创建框架线程前屏蔽优雅退出信号。
    // Reactor 和 Worker 线程会继承相同的信号掩码。
    if(!ServerSetting::blockTerminationSignals())
    {
        std::cerr << "failed to block SIGINT/SIGTERM\n";
        return 1;
    }

    HttpServer server;
    server.setFunction("/ping",
        [](HttpServerFDHandler &client, HttpRequestInformation &) {
            return client.sendText("pong") ? 1 : -2;
        });

    // 最多等待五秒,让在途任务和排队响应完成。
    server.setGracefulShutdownTimeout(5000);

    if(!server.startListen(8083))
    {
        std::cerr << "failed to listen on port 8083\n";
        return 2;
    }

    std::cout << "Signal demo listening on http://127.0.0.1:8083\n"
              << "Press Ctrl-C or run: kill -15 " << ::getpid() << "\n";

    // sigwait 风格同步等待可避免在异步信号上下文中清理资源。
    const int receivedSignal = ServerSetting::waitForTerminationSignal();
    if(receivedSignal < 0)
    {
        std::cerr << "failed while waiting for termination signal\n";
        return 3;
    }

    std::cout << "received "
              << (receivedSignal == SIGINT ? "SIGINT" : "SIGTERM")
              << ", starting graceful shutdown\n";

    // 绝不能在异步 signal handler 中删除或关闭 Server。
    return server.close() ? 0 : 4;
}