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