gpt4 book ai didi

c++ - 为什么 boost asio 信号处理程序会立即取消?

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:17 24 4
gpt4 key购买 nike

我有以下代码片段:

#include <signal.h>
#include <boost/asio.hpp>
#include <iostream>

void startAsyncWaitForSignal(boost::asio::io_service& ioService)
{
boost::asio::signal_set signals{ioService};
signals.add(SIGTERM);
signals.async_wait(
[&ioService](boost::system::error_code errorCode, int signalNumber)
{
std::cerr << errorCode.message() << std::endl;
if (!errorCode) {
std::cerr << "received signal " << signalNumber << std::endl;
startAsyncWaitForSignal(ioService);
}
}
);
}

int main() {
boost::asio::io_service ioService;
startAsyncWaitForSignal(ioService);
ioService.run();
}

我希望这个程序等待,直到第一个 SIGTERM 到达,然后等待下一个,然后再到下一个,...

但是程序会立即终止,输出如下:

Operation canceled

这次立即取消操作的原因是什么?我试图制作一个 io_service::work 对象,但这只是改变了 ioService.run() 未完成的事实,但 signal_set 仍然立即被取消。

我正在使用 boost 1.54。有一个bug fix related to asio/signals in 1.55 ,但这看起来像是一个不同的问题。

最佳答案

当离开 startAsyncWaitForSignal() 时,本地 signal_set 变量被销毁并且 async_wait() 调用被取消。 signal_set 需要再活久一点。将其移出 startAsyncWaitForSignal() 并将其作为参数传递,例如:

#include <signal.h>
#include <boost/asio.hpp>
#include <iostream>

void startAsyncWaitForSignal(boost::asio::io_service& ioService, boost::asio::signal_set& signals)
{
signals.async_wait(
[&ioService, &signals](boost::system::error_code errorCode, int signalNumber)
{
std::cerr << errorCode.message() << std::endl;
if (!errorCode) {
std::cerr << "received signal " << signalNumber << std::endl;
startAsyncWaitForSignal(ioService, signals);
}
}
);
}

int main() {
boost::asio::io_service ioService;
boost::asio::signal_set signals{ioService};
signals.add(SIGTERM);
startAsyncWaitForSignal(ioService, signals);
ioService.run();
}

关于c++ - 为什么 boost asio 信号处理程序会立即取消?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21115692/

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