- 博客(17)
- 收藏
- 关注
原创 Linux C++ 单实例锁:用 flock 实现可靠的进程互斥
本文介绍基于 Linux `flock` 系统调用的单实例锁实现方案。相比传统的 PID 文件方案,`flock` 的核心优势在于进程异常崩溃时内核会自动释放锁,不会留下僵尸锁导致后续启动失败。文章提供了 C++(RAII 风格)和 C 两种通用实现,支持自定义锁文件路径,并详细分析了各种退出场景下的锁释放行为、边界情况处理以及生产环境中的注意事项(如 NFS 兼容性、容器部署、systemd 管理等)。该方案零性能开销,是 nginx、redis 等生产级软件广泛采
2026-08-24 16:22:21
302
原创 Qt QTabWidget 点击事件完全指南:解决 currentChanged 信号局限性
本文介绍了在Qt开发中监听QTabWidget标签页点击事件的解决方案。针对QTabWidget自带的currentChanged信号无法响应当前标签页重复点击的问题,提出了三种实现方案:1)直接使用QTabBar的tabBarClicked信号;2)继承QTabWidget并实现事件过滤器;3)在现有类中安装事件过滤器。文章详细说明了每种方案的具体实现方法,并提供了完整的示例代码,同时提醒开发者注意事件过滤器顺序、性能优化和跨平台兼容性等问题。这些方案可根据项目需求灵活选择,有效解决了QTabWidget
2026-01-15 09:37:19
572
原创 C++并发编程:lock_guard vs unique_lock 的选择之道
本文对比了C++并发编程中的两种锁管理器:std::lock_guard和std::unique_lock。std::lock_guard是简单的RAII包装器,自动加解锁,性能开销小;std::unique_lock提供更灵活的锁控制,支持手动操作、条件变量和锁转移,但性能开销较大。建议优先使用lock_guard处理简单临界区,仅在需要条件变量、手动锁控制或锁转移时才选择unique_lock。文章强调了条件变量必须配合unique_lock使用的原因,并给出了不同场景下的最佳实践建议。
2025-11-17 10:00:29
542
原创 Qt 国际化完全指南:从 .pro 到 .qm 文件的完整流程
Qt 的国际化工具链提供了一套完整的解决方案,从源代码中提取字符串到最终生成翻译文件。通过合理使用lupdatelinguist和lrelease工具,可以轻松实现应用程序的多语言支持。使用tr()包装所有需要翻译的字符串定期更新翻译文件保持翻译文件与源代码同步测试所有语言的显示效果。
2025-10-23 15:58:49
1191
原创 C++返回值优化:选择返回值、引用还是std::move?
是编译器的一种优化技术,它允许编译器在函数返回临时对象时,直接在调用者的内存空间中构造对象,从而避免不必要的拷贝操作。// RVO:直接在调用者空间构造对象// 命名对象// ... 对obj进行操作return obj;// NRVO:直接在调用者空间构造对象优先直接返回值:让编译器进行RVO/NRVO优化,这是最简洁且通常最高效的方式。谨慎返回引用:只在返回生命周期足够长的对象时使用,避免返回局部对象的引用。少用std::move:只在特定情况下(如条件返回)使用,因为它可能会阻止NRVO优化。
2025-08-15 11:44:13
864
原创 避免 inet_ntoa 的陷阱:使用 inet_ntop 安全转换IP地址
使用 inet_ntoa 时要注意它返回的是一个静态指针,连续调用会导致结果被覆盖。使用 inet_ntop 可以避免这个问题,因为它允许你指定一个缓冲区来存储转换后的字符串。希望这篇文章能帮助你更好地理解和使用 inet_ntoa 和 inet_ntop 函数。在处理网络编程任务时,选择正确的函数并正确使用它们是非常重要的。希望这篇文章对你有帮助!
2025-01-16 10:04:48
756
原创 分享一个std::string字节转换时的问题
std::string 在大多数实现中是使用 char 类型来存储字符的,而 char 在很多系统中是有符号的(signed)。将 unsigned char 数组的内容赋值给 std::string 时,如果 std::string 内部使用的是有符号的 char 类型,那么任何大于 127 的值都会变成负数。这是因为有符号 char 的最高位是符号位。在这个例子中,buff[2] 和 buff[3] 可能被解释为有符号的 char 类型,因此它们的值可能被错误地解释为负数。遇到了两种不同的输出结果。
2024-12-13 10:52:07
407
原创 QString处理UTF-8字符乱码问题
但是,如果在读取的数据中包含多字节字符(如 UTF-8 编码的中文),数据可能不是按完整的 UTF-8 字符边界被读取,这些字符被分割在两个或更多的 read() 调用之间,那么可能会遇到乱码问题。因此,如果一个中文字符被分割在两个 read() 调用之间,而你的缓冲区太小无法容纳这个字符的完整表示,那么在下一个 read() 调用时,之前的字符的剩余部分可能已经被新的数据覆盖,导致乱码。但是,即使增加了缓冲区的大小,也不能保证每次 read() 调用都会返回完整的 UTF-8 字符序列,
2024-07-19 17:08:04
1456
原创 检测POSIX 线程是否运行结束
当信号参数为 0 时,该函数不会发送任何信号,而是用于检查线程的存在性。实现一个类似std::thread::joinable()函数,用于查看linux c/c++为 POSIX 线程线程是否运行结束,不能阻塞主进程。通常情况下,pthread_kill() 用于向线程发送取消信号 SIGCANCEL 或自定义的线程间通信信号。pthread_kill() 是 POSIX 线程库中的一个函数,用于向指定线程发送信号 sig。如果 sig 为 0,则不发送信号,但会检查线程是否存在。
2024-07-12 17:05:26
436
原创 使用libusb库实时监测usb设备插拔信息
使用libusb库实时监测usb设备插拔信息,信息包括USB插拔状态、USB接口号、设备名称iProduct、厂商名称iManufacturer、设备编号idProduct、厂商编号idVendor、接口编号、USB类型码bDeviceClass,与lsusb -v所获取的信息一致,接口号与lsusb -t显示信息一致,厂商名称id为0时,名称获取不到,用厂商编号填充。
2023-07-12 16:30:52
1789
1
原创 std::string类以值传递传入函数参数,源字符串被修改的情况
很明显,原字符串已经被修改,std::string::c_str() 返回一个 const char* 类型的指针,指向 std::string 内部存储的字符数组副本。分享一个std::string使用当中遇到的问题,众所周知,当std::string对象以值传递的方式传入函数参数时,会走拷贝构造函数,即生成一个副本传入函数,原始字符串的内容不会被修改。所以说,为了防止出现意外情况,修改 std::string 对象的内容最好使用 std::string 的成员函数来进行。
2023-07-12 16:12:55
669
1
原创 SM4加密算法的C/C++实现与应用
* @brief 加密文件*/void Encrypt(std::string SrcPath);* @brief 解密文件*/void Decrypt(std::string SrcPath);* @brief 加密字符串 * @param SrcPath (传入) 需要加密的字符串 * @param DestPath (传出) 加密后的密文字符串 **********************************************************************
2022-09-27 00:02:28
8010
5
原创 QTableVIew表格数据实时更新时选中行光标消失的解决方法
模型由继承QAbstractItemModel重写实现,在数据更新前先记录选中行,数据更新后,重新设置选中行class Model : public QAbstractItemModel{ Q_OBJECTpublic: Model( ); ~Model(); int rowCount(const QModelIndex &parent = QModelIndex()) const; virtual int columnCount(const QModelInd
2022-06-17 09:27:19
1645
原创 Qt一个主界面添加三个自定义QTableView,QTableView数据动态刷新,不拉伸,显示不全时主界面滚动条滑动查看
主界面继承QWidgettable继承QTableView 数据更新使用继承抽象类QAbstractItemModel考虑到多个表垂直布局,表中数据不同,表格会被拉伸或压缩,查看信息需要分别去滑动每个表的滚动条,所以,为了方便美观,做了如下处理,只拉伸主界面。table1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);//设置表水平可任意拉伸压缩,垂直不可拉升压缩table2->setSizePolicy(QSizePolicy::Ex
2022-06-15 12:11:53
2975
国密算法sm4,可加密数据支持中英文特殊字符,可加密文件或字符串,支持cbc和ecb模式
2022-10-10
Debian10图形界面方式登录
2023-02-07
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅