gpt4 book ai didi

c++ - 执行中断信号时服务器停止操作的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 04:58:07 25 4
gpt4 key购买 nike

我正在编写一个带有永久循环的小型服务器,我希望能够正确停止它,例如,在 Ctrl + C (SIGINT) 上。

class Server
{
...
public:
void loop()
{
while(_run_flag)
{
// do something
}
}
void stop()
{
_run_flag = 0;
}
...
private:
volatile sig_atomic_t _run_flag = 1;
};

namespace
{
std::function<void()> callback_wrapper;

void signal_handler(int)
{
callback_wrapper();
}

}

int main()
{
std::unique_ptr<WSGIServer> server = CreateServer("127.0.0.1", 4009);
callback_wrapper = [&](){ server->stop(); };

struct sigaction sigIntHandler;
sigIntHandler.sa_handler = signal_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);

server->loop();

return 0;
}

我有以下问题:

  1. 我应该使用什么类型的run_flag_variable?使用 volatile sig_atomic_t 可以吗?
  2. signal_handler 中调用 stop 方法安全吗?

最佳答案

看起来几乎是合法的,除了我可以提出一些改进建议。一个不是那么严重:如果你只能使用 C++,我的意思是原语形成 csignal header ,并尽量避免 volatile 我们已经有了 atomic东西,更多你可以看我的回答here ,认为这个问题不太相关。其次,在信号处理程序中有很多关于你能做什么和不能做什么的警告,C++-14,17 已经改变了很多,除了有一些非标准的,但是特定于平台的做事方式,但是最简单的规则是你必须使用原子/易变的东西,如果你不这样做,你必须有充分的理由并且是特定于平台的。

std::atomic_bool global_run_flag(true);

class Server {
public:
Server() : _local_run_flag(true) {}

void loop() {
while (_local_run_flag && global_run_flag) {
// do something
}
}
void stop() { _local_run_flag = false; }

private:
std::atomic_bool _local_run_flag;
};

void signal_handler(int) { global_run_flag = false; }

int main() {
std::unique_ptr<Server> server(new Server);

std::signal(SIGINT, &signal_handler);

server->loop();

return 0;
}

例如,我举了一个示例,说明如何从信号处理程序跟踪全局条件集,以及如何在需要时从其他线程跟踪本地条件集。

关于c++ - 执行中断信号时服务器停止操作的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51800158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com