【发布时间】:2012-07-13 10:10:02
【问题描述】:
我编写了这个程序,它有一个 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::signal 但面临这个问题,并且可以在代码库中正式使用 Asio,那么 Asio 支持这个.
标签: c++ lambda c++11 signals posix