使用信号处理程序释放资源

use signal handler to release resources?

本文关键字:释放资源 程序 信号处理      更新时间:2023-10-16

我写了一个套接字服务器。我意识到当我在运行时按 Ctrl-C 时,可能会有一些内存泄漏。我用valgrind找到了这个。

我的服务器代码非常简单。基本上,我创建一个 Listener 对象,启动一个线程以接受连接并尝试加入该线程:

 try {
    Server::Listener listener(1234);
    boost::thread l(boost::bind(&Server::Listener::start, &listener));
    l.join();
} catch(exception& e) {
    cout<<e.what()<<endl;
}

当我运行valgrind时,它给了我:

==3580== 命令:bin/调试/p_rpc
==3580==
李斯特纳开始...
循环中..
^C==3580==
==3580== 堆摘要:
==3580== 退出时使用:24 个块
中的 3,176 字节==3580== 堆总使用量:28 个分配,4 个空闲,4,328 个字节已分配
==3580==
==3580== 1 块中的 288 个字节可能在丢失记录中丢失 21 个,共 24
个==3580== 在0x4C29E46: calloc (在/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
)==3580== 按0x4012084: _dl_allocate_tls (dl-tls.c:297)
==3580== 按0x4E3AABC: pthread_create@@GLIBC_2.2.5 (分配堆栈.c:571)
==3580== 按0x5260F9F: boost::thread::start_thread() (在/
usr/lib/libboost_thread.so.1.49.0 中)==3580== 按0x407B93: boost::thread::thread, boost::_bi::list1>>>(boost::_bi::bind_t, boost::_bi::list1>>&&) (thread.hpp:171)
==3580== 按0x404CA4: 主 (主.cpp:179)
==3580==
==3580== 泄漏摘要:
==3580== 绝对丢失:0 块
中的 0 个字节==3580== 间接丢失:0 块
中的 0 个字节==3580== 可能丢失:1 个块中 288 个
字节==3580== 仍然可以访问:23 个块
中的 2,888 字节==3580== 抑制:0 块
中的 0 字节==3580== 不显示可访问的块(找到指针的块)。
==3580== 要查看它们,请重新运行:--泄漏检查=完整 --显示可到达=是
==3580==
==3580== 对于检测到和禁止显示的错误计数,请使用:-v
重新运行==3580== 错误摘要:来自 1 个上下文的 1 个错误(已抑制:来自 2
个)杀

它指出可能有288字节丢失。我想我可以使用信号处理程序来释放这个资源。但我不知道我是怎么做到的。你能给我举个例子吗?

干杯埃尔顿

当进程关闭时,操作系统会自动清理进程拥有的所有内存。您无需担心程序退出时释放该内存。该建筑正在被拆除。不要费心扫地,清空垃圾桶和擦除白板。并且不要在建筑物的出口处排队,这样每个人都可以将他们的进出磁铁移出。你所做的只是让拆迁队等你完成这些毫无意义的房屋清洁任务。

您需要担心的泄漏类型是在程序生命周期内不断泄漏的泄漏类型。

原则上,您可以销毁那里的对象。在信号处理程序中可以执行的操作存在限制,并且它们与线程混合得非常糟糕。请注意,在这个区域中,编译器不能(或很少)进行检查,信号处理程序只是一个普通的函数。要格外小心。

这个问题的答案给出了一些关于如何做到这一点的细节。