c++ - 使用 Auto 和 Lambda 处理信号?

标签 c++ lambda c++11 signals posix

我已经编写了这个程序,它有一个 main 函数,在其中,我创建了两个套接字,如下所示:

int sockfd1 = socket(AF_INET, SOCK_STREAM, 0);
int sockfd2 = socket(AF_INET, SOCK_STREAM, 0);

现在我用它们做一些事情,当用户按下 Ctrl+C 来终止进程时,我想确保套接字正确关闭,所以我这样做:

auto sigTermHandler = [&] (int param) { close(sockfd1); close(sockfd2); };
signal(SIGTERM, sigTermHandler);

但是当编译为 g++ -std=gnu++0x <filename>.cpp 时会引发以下编译错误:

error: cannot convert ‘main(int, char**)::<lambda(int)>’ to ‘__sighandler_t {aka void (*)(int)}’ for argument ‘2’ to ‘void (* signal(int, __sighandler_t))(int)’

难道不能以这种方式使用 lambda 来处理信号吗?请指教。

附:我知道如果我做了正确的 OOP,我可以把它放在析构函数中,但我很想知道这是否有效。

最佳答案

有点晚了,但如果有人需要这样的解决方案,可以使用 std::function 作为包装器来保存能够捕获变量的 lambda:

#include <functional>
#include <iostream>

namespace {
std::function<void(int)> shutdown_handler;
void signal_handler(int signal) { shutdown_handler(signal); }
} // namespace

int main(int argc, char *argv[]) {
  std::signal(SIGINT, signal_handler);
  MyTCPServer server;
  shutdown_handler = [&](int signal) {
    std::cout << "Server shutdown...\n";
    server.shutdown();
  };
  server.do_work_for_ever();
}

关于c++ - 使用 Auto 和 Lambda 处理信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11468414/

相关文章:

ruby-on-rails - Rails : named_scope, lambda 和 block

generics - Kotlin 中扩展函数的多态性

c# - 一个 C# lambda 表达式可以有多个语句吗?

c++ - 如何从用户定义的函数返回一个 3D 数组?

c++ - tbb::parallel invoke 仅执行一次函数

c++ - 如何设置条件断点来测试 CString 变量是否为空

std::vector 的 C++ 钳位函数

c++ - 编译器或定义行为的可能优化

java - 是否有用于管道和过滤器范例的开源 java/c/c++ 框架?

c++ - 定义一个深度/维度未知的 C++ 模板