- 博客(19)
- 收藏
- 关注
原创 【C语言】一篇文章搞懂extern的使用
本文介绍了C语言中extern关键字的作用与用法。extern用于声明在其他文件中已定义的变量或函数,实现跨文件共享数据。它不分配内存,而是建立符号引用供链接器解析。与static相比,extern具有外部链接性,而static限制作用域仅在当前文件内。文章还解释了extern "C"的用途:解决C++调用C函数时的名称修饰问题,确保正确链接。通过示例代码展示了extern变量定义、声明及编译链接过程,帮助初学者理解这一关键概念。
2026-02-02 14:37:54
288
原创 【C语言】什么是野指针?
野指针是指向非法内存空间的指针,会导致程序崩溃、数据损坏等问题。常见情况包括未初始化的指针和使用已释放内存的悬空指针。与之不同,空指针(NULL/nullptr)指向空地址,是安全的初始化方式。正确做法是在释放内存后将指针置空,避免野指针问题。理解指针、内存和地址的关系是掌握这些概念的基础。
2026-01-08 11:37:13
326
原创 【问题解析】我的客户端与服务器交互无响应了?
本文介绍了在QT项目中遇到的TFTP服务器多文件传输失败问题。通过观察内存变化发现存在内存泄漏,定位到问题根源是阻塞式socket缺乏重传机制和超时处理。解决方案是采用select I/O复用模型实现超时控制,并加入重传机制。文中提供了完整的服务器示例代码,包含socket创建、客户端连接处理、带超时的数据接收等功能模块,有效解决了服务器阻塞和内存泄漏问题。
2025-12-29 22:26:09
590
原创 【UNIX网络编程】I/O多路复用
本文介绍了I/O多路复用技术及其三种实现方式:select、poll和epoll。I/O多路复用通过单个线程监控多个文件描述符,提高I/O效率。select使用固定大小的位图结构,存在1024个描述符限制和轮询效率低的问题;poll改用动态数组,消除了数量限制但仍需轮询;epoll采用红黑树和就绪链表,实现了高效的事件通知机制,支持水平触发和边缘触发两种模式。文章详细说明了各技术的API接口、使用流程和底层原理,并通过代码示例展示了具体实现,最后比较了各技术的优缺点,指出epoll在高并发场景下的性能优势。
2025-08-01 09:49:19
1231
1
原创 【UNIX网络编程】5种I/O模型
本文介绍了五种I/O模型的工作原理:阻塞I/O全程等待;非阻塞I/O通过轮询检查状态;I/O复用通过select等机制监控多个描述符;信号驱动I/O由内核主动通知数据就绪;异步I/O则由内核完成所有操作后通知结果。文章通过老王烧水的生动比喻,形象说明了各种模型的特点,指出阻塞I/O效率最低,非阻塞I/O消耗CPU资源,I/O复用可提高效率,而异步I/O性能最优。不同模型适用于不同场景,理解其差异有助于系统优化。
2025-07-31 13:40:36
2181
原创 【C语言】命令行参数
本文讲解了C语言中命令行参数的传递原理。gcc命令后面的参数会传递给main函数的两个形参:argc表示参数数量,argv是指向参数字符串数组的指针。第一个参数通常是程序名称,后面的才是用户输入的参数。文章通过ls命令的示例说明程序名参数的用途,并给出一个简单的参数打印程序演示参数处理过程,帮助读者理解命令行参数的工作原理。
2025-07-30 11:27:41
742
原创 【C语言】数组和指针一样吗?
本文介绍了C/C++中数组与指针的核心区别与联系。数组是连续内存块的别名,直接存储数据且大小固定,而指针是存储内存地址的变量。虽然数组名在表达式中会退化为指向首元素的指针常量,使二者都能使用[]或指针算术访问元素,但它们在内存分配、sizeof行为、可修改性等方面存在本质差异。特别强调数组名作为sizeof或&操作数时不会退化,此时&arr得到的是整个数组的地址而非首元素地址。理解这些区别对避免编程错误和写出高效代码至关重要。
2025-07-28 11:08:32
925
原创 【开发环境配置】VScode里面配置cmake遇到的问题
本文总结了使用CMake时常见的三种错误及解决方法。首先需要确保VSCode安装了必要扩展包并正确编写CMakeLists.txt文件。
2025-07-25 14:55:01
3718
原创 【进程间通信】Posix 共享内存
本文介绍了共享内存通信机制及其相关函数。共享内存是进程间通信(IPC)中最快的方式,通过将内存映射到进程地址空间,避免了内核数据拷贝的开销。文章详细讲解了mmap、munmap、msync等核心函数,以及Posix共享内存区的shm_open/shm_unlink方法。通过生产者-消费者模型的代码示例,展示了如何使用环形队列结合信号量实现共享内存通信。该机制相比管道、消息队列等传统IPC方式,减少了数据在内核和用户空间之间的复制次数,显著提高了通信效率。文末提供的完整代码示例可帮助理解共享内存的实际应用。
2025-07-24 16:15:30
2416
原创 【进程间通信】Posix 信号量
本文介绍了POSIX信号量的两种类型及其使用方式。有名信号量通过内核维护,使用sem_open()创建/打开,sem_wait()/sem_post()进行P/V操作,sem_close()/sem_unlink()关闭删除。基于内存的信号量通过sem_init()初始化,需配合共享内存实现进程间同步。文中提供了两种信号量的代码示例:有名信号量的生产者-消费者模型演示了基本的同步操作;基于内存的信号量则实现了一个环形队列的生产者-消费者模型。
2025-07-24 10:57:26
1292
原创 【进程间通信】Posix 消息队列
Posix消息队列比较简单:mq_open创建一个新队列或打开一个已存在的队列,mq_close关闭队列,mq_unlink则删除队列名。往一个队列中放置消息使用mq_send,从一个队列中读出消息使用mq_receive。队列属性的查询与设置使用mq_getattr和mq_setattr,函数mq_notify则允许我们注册一个信号或线程,它们在有一个消息被放置到某个空队列上时发送(信号)或激活(线程)。队列中的每个消息被赋予一个小整数优先级,mq_receive每次被调用时总是返回最高优先级的最早消息。
2025-07-22 09:49:54
1114
原创 【进程间通信】Posix IPC
Posix IPC概述 Posix IPC包含消息队列、信号量和共享内存三类进程间通信机制。三类IPC均以/name格式命名,通过mq_open、sem_open和shm_open创建或打开,支持O_CREAT(不存在则创建)、O_EXCL(排他创建)等标志。权限模式mode(八进制数)指定读写权限。
2025-07-21 14:28:30
784
原创 【UNIX环境高级编程】线程_1_线程创建
本文介绍了POSIX线程的基本概念和使用方法。POSIX线程允许多线程并发执行,提升程序效率。传统UNIX进程是单线程的,而多线程使一个进程能同时处理多个任务。每个线程拥有唯一ID,需使用pthread_equal()比较ID。通过pthread_create()创建新线程,可设置线程属性和启动函数;新线程继承进程地址空间、浮点环境和信号屏蔽字,但不继承未决信号集。示例代码演示了线程创建、ID获取、参数传递和等待过程。
2025-07-21 10:34:25
375
原创 【UNIX环境高级编程】线程控制_1_线程属性
本文介绍了线程属性的设置方法,重点讲解了pthread_attr_t结构体的使用。主要内容包括:1)通过pthread_attr_init()和pthread_attr_destroy()初始化和销毁线程属性;2)设置分离状态(detachstate)属性,使线程以分离状态启动;3)线程栈属性(stackaddr/stacksize)的获取和设置方法;4)警戒缓冲区大小(guardsize)属性的作用及设置。文中还提供了设置分离状态线程的完整代码示例,并分析了线程属性操作的注意事项。这些属性设置可以优化线程
2025-07-19 15:35:55
1109
原创 【UNIX环境高级编程】c语言实现线程池(基础版)
本文介绍了一个基础的线程池实现代码及其原理。线程池通过预先创建线程、复用线程来避免频繁创建销毁的开销,提高系统性能。文章提供了完整的C语言实现代码,包括线程池初始化、任务添加和销毁等功能。核心组件包括线程池管理者、任务队列和工作线程。同时讨论了线程池参数设置原则:CPU密集型任务推荐线程数等于CPU核数,I/O密集型任务可设为CPU核数的2倍。后续将扩展动态调整等进阶功能。
2025-07-18 14:27:24
886
原创 【C语言】结构和联合
摘要:本文介绍了C语言中结构和联合两种复合数据类型。结构体用于组合不同类型的数据项(如人的姓名、年龄等)。联合体则允许多个成员共享同一内存空间,同一时间只能存储一个成员值,常用于节省内存或类型转换场景。
2025-07-16 16:34:33
556
原创 【UNIX环境高级编程】线程_6_线程同步
本文介绍了多线程编程中的同步机制,重点讲解了互斥量、读写锁和条件变量的原理及使用方法。互斥量通过加锁确保共享资源的独占访问,避免数据竞争;读写锁允许多线程同时读取但互斥写入,提高并发性能;条件变量使线程能有效等待特定条件满足。文章通过代码示例展示了这些同步机制的实际应用,包括避免死锁的方法、读写锁的使用场景以及生产者-消费者模型的实现。最后强调合理使用这些同步机制对保证多线程程序正确性的重要性。
2025-07-16 13:44:53
1131
原创 【UNIX环境高级编程】线程_5_线程终止
本文介绍了POSIX线程库中线程终止与清理的相关函数。主要内容包括:pthread_exit() - 线程显式终止自身并传递退出状态值pthread_join() - 阻塞等待线程终止并获取其退出值pthread_cancel() - 请求取消指定线程pthread_cleanup_push/pop() - 注册和调用线程清理处理程序,用于资源释放
2025-07-15 20:21:36
718
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅