- 博客(38)
- 收藏
- 关注
原创 C语言实战6
本文总结了C语言编程的关键实战技巧:1. 使用const定义常量提高可读性,指针操作前检查NULL;2. 内存管理需检查malloc返回值并用valgrind检测泄漏;3. 文件操作注意二进制读写和文本行读取;4. 多线程编程要确保线程安全;5. 调试时使用gdb和格式化输出;6. 性能优化可采用循环展开和inline函数;7. 跨平台开发使用条件编译和CMake管理;8. 推荐GLib、libevent等实用库。这些技巧涵盖从基础语法到高级优化的各个方面。
2025-12-16 21:53:43
356
原创 Linux学习日记21:读写锁
摘要:本文介绍了Linux系统中的读写锁机制,其核心思想是"读者共享,写者独占",通过允许多个读者同时访问共享资源来提高读多写少场景下的并发性能。文章详细讲解了读写锁的特性、工作模式、应用场景及与互斥锁的区别,并提供了C语言实现示例,展示了读写锁如何解决并发读写问题。通过代码对比演示了不加锁和加读写锁两种情况下的程序运行效果,验证了读写锁在保证数据一致性方面的有效性。
2025-12-16 21:52:19
844
原创 C语言实战5
本文总结了C语言实战中的核心应用与技巧,涵盖基础语法强化、内存管理、文件操作、多线程与网络编程等内容。重点包括:严格匹配变量类型、指针操作安全规范、动态内存分配与释放、结构体/联合体应用、文件读写错误处理、多线程创建和Socket通信实现。同时介绍了GDB调试、性能优化(如循环展开)等实用技巧,并强调规避数组越界、缓冲区溢出等常见陷阱。通过规范代码和实际案例,帮助开发者提升工程化能力,确保内存安全和边界检查。
2025-12-15 16:12:25
240
原创 Linux学习日记20:死锁
本文介绍了死锁的概念及其在并发编程中的表现。死锁指多个线程因竞争共享资源而互相等待,导致永久阻塞。文章分析了死锁发生的四个必要条件:互斥、占有且等待、不可抢占和循环等待。通过两个典型示例(重复加锁和交叉加锁)展示了死锁场景,并提供了三种避免死锁的方法:固定加锁顺序、一次性获取所有锁和使用trylock回退机制。最后指出死锁无法自行恢复,且锁持有时间过长会增加死锁风险。这些内容为理解并解决多线程编程中的死锁问题提供了实用指导。
2025-12-15 16:04:36
796
原创 Linux学习日记19:线程同步与互斥锁
本文介绍了多线程编程中的线程同步技术,重点讲解了互斥锁的实现机制。首先通过一个反面案例展示了多线程并发访问共享资源时可能出现的数据不一致问题,说明线程同步的必要性。接着详细阐述了互斥锁的定义、底层实现原理及相关API函数的使用方法,包括静态/动态初始化、阻塞/非阻塞加锁、解锁等操作。最后通过代码示例演示了如何使用互斥锁解决线程竞争问题,确保对共享资源的原子访问。文章强调互斥锁是解决竞态条件、保证数据一致性的核心同步机制。
2025-12-12 18:33:15
1366
原创 C语言实战4
内存泄漏和野指针是C语言常见问题。动态分配内存后未释放会导致内存泄漏,访问已释放的内存则会产生野指针。数组名在多数情况下会退化为指针,但二者并非完全等价。数组名是常量指针,不可重新赋值。通过以上方法,可以有效解决C语言开发中的常见问题,提升代码的健壮性和可维护性。将代码模块化到多个文件中,通过头文件声明函数和全局变量。文件读写需检查打开是否成功,操作完成后关闭文件。等函数时需确保目标缓冲区足够大,避免溢出。宏进行断言检查,结合。
2025-12-12 09:56:00
249
原创 C语言实战3
本文介绍了基于C语言开发的学生成绩管理系统。系统采用结构体存储学生信息,实现动态内存管理和文件读写功能。核心模块包括成绩录入、查询统计及二进制文件存储,通过控制台菜单实现交互界面。项目注重错误处理机制和内存泄漏防护,并提供了扩展建议(如链表结构、图形界面等)。开发过程中强调代码注释规范和版本控制工具的使用。该系统实现了学生成绩管理的基础功能,具有良好的可扩展性。
2025-12-12 09:55:28
309
原创 C语言实战2
本文介绍了使用C语言实现学生信息管理系统的案例,重点演示了文件操作与数据结构的结合应用。系统通过链表存储学生信息(包括学号、姓名和成绩),实现了文件读写、动态内存管理以及增删改查等核心功能。关键技术点包括:使用结构体定义链表节点、文件与链表间的数据转换、链表插入删除操作、基于成绩的冒泡排序算法,以及增强的错误处理机制。该系统可作为C语言中级开发的典型范例,后续可扩展搜索功能和交互界面等模块。
2025-12-12 09:54:40
335
原创 C语言实战
摘要:本文总结了C语言在实战开发中的核心应用场景,包括基础数据类型操作、内存管理、文件处理等基础内容,以及数据结构实现、算法编写、多线程编程和网络通信等进阶应用。重点展示了变量声明、动态内存分配、文件读写、链表实现、快速排序等典型代码示例,同时介绍了POSIX线程创建和TCP网络编程方法,最后提供了gdb调试和循环展开优化等实用技巧。
2025-12-11 21:01:45
310
原创 Linux学习日记18:线程的分离
本文介绍了线程分离的概念与实现方法。主要内容包括:1)pthread_detach()函数的原型、工作原理及两种实现方式(创建后分离和创建时直接分离);2)线程分离的执行流程,涉及用户态属性修改和内核态资源回收机制;3)7个重要注意事项,如分离状态不可逆、调用时机要求等;4)动态分离与静态创建两种方法的对比分析。通过示例代码演示了线程分离的具体实现,并比较了两种方法的适用场景和优缺点。
2025-12-11 20:58:34
1064
原创 Linux学习日记17:线程的创建与使用
本文介绍了Linux系统中线程的基本概念和操作。主要内容包括:1.线程与进程的关系,指出线程是共享进程资源的轻量级执行单元;2.线程的核心属性,如线程ID、独立栈空间和私有数据等;3.线程操作函数,包括创建(pthread_create)、等待(pthread_join)和退出(pthread_exit);4.通过实例演示线程创建、退出和等待的实现方式,并比较了pthread_exit与exit的区别。文章强调Linux将线程视为任务统一管理,使用POSIX线程库需链接-lpthread,并解释了避免僵尸线
2025-12-10 16:09:14
1130
原创 Linux学习日记16:守护进程
Linux守护进程是一种特殊的后台服务进程,用于提供系统核心功能支持。它具有脱离终端控制、独立会话、生命周期长等特点,通常由init进程收养。创建守护进程的关键步骤包括:fork子进程后父进程退出、调用setsid创建新会话、改变工作目录、设置文件权限掩码和关闭不必要的文件描述符。示例代码演示了守护进程创建过程,该进程脱离终端控制后无法通过Ctrl+C终止,只能使用kill命令强制关闭。守护进程在系统监控、网络服务等场景中发挥重要作用。
2025-12-08 15:04:30
1073
原创 Linux学习日记15:信号
本文介绍了Linux系统中的信号机制,主要内容包括:信号的基本概念和分类(不可靠信号1-31和可靠信号32-64);常见信号的作用(如SIGINT、SIGKILL、SIGTERM等);信号的生命周期和处理方式(默认处理、忽略和捕获);相关系统调用(kill、raise、alarm、pause、signal等)。通过多个示例演示了信号的使用方法,包括父子进程间通过信号通信,以及使用wait函数避免僵尸进程等问题。信号是Linux系统中重要的进程间通信和事件通知机制,掌握其原理和使用方法对系统编程至关重要。
2025-12-07 11:59:32
801
原创 Linux学习日记14:共享内存
摘要:共享内存是Linux中最高效的进程间通信(IPC)方式之一,通过直接映射同一块物理内存实现多进程数据共享。其核心特点是高效(无数据拷贝)、无内置同步机制(需手动处理并发)、生命周期独立于进程。主要使用4个系统调用:shmget创建/获取共享内存,shmat映射到进程空间,shmdt解除映射,shmctl控制/删除内存段。实验演示了共享内存的创建、映射、读写操作和进程间通信流程,验证了其高效性和数据共享特性。需要注意的是,共享内存不会自动释放,必须显式调用shmctl或使用ipcrm命令删除。
2025-11-18 16:23:37
764
原创 Linux学习日记13:消息队列
Linux消息队列是一种高效的进程间通信(IPC)机制,通过内核维护的消息链表实现结构化数据传输。其核心特性包括:消息类型标识、异步通信、独立于进程存在等。SystemV消息队列提供了msgget(创建)、msgsnd(发送)、msgrcv(接收)和msgctl(控制)等关键函数。ftok函数用于生成共享键值,使不同进程能访问同一队列。示例代码展示了单进程和多进程间的消息传递,以及全双工通信的实现方式,最后通过父子进程实现双向消息传递。消息队列相比管道和信号能更好地支持结构化数据传输。
2025-11-17 21:46:11
776
原创 Linux学习日记12:无名通道与有名通道
本文介绍了Linux进程间通信的两种基础方式:无名管道和有名管道。无名管道(Pipe)通过pipe()系统调用创建,仅限具有亲缘关系的进程间单向通信,数据在内核缓冲区传输,随进程结束而销毁。有名管道(FIFO)通过mkfifo创建,以文件系统路径标识,允许任意进程间通信,具有半双工特性,生命周期与文件系统绑定。文章详细比较了二者的特点,并通过代码示例演示了创建和使用过程,包括实现"ps aux | grep bash"命令及有名管道的读写操作。两种管道都是Linux进程间简单高效的数据交
2025-11-14 17:00:39
829
原创 Linux学习日记11:Linux进程
本文系统介绍了Linux系统中的进程管理知识,主要包括:1.进程概念:进程是程序执行的实例,包含代码、数据和进程控制块(PCB),具有并发执行、独立地址空间和动态生命周期等特性。2.进程状态:详细讲解了初始态、就绪态、运行态、挂起态和终止态五种基本状态及其转换关系。3.进程控制:重点分析了fork函数的工作原理、父子进程关系及数据共享机制,以及exec函数族的六种变体及其应用场景。4.特殊进程:深入探讨了孤儿进程和僵尸进程的形成原因、系统影响及处理方法。5.进程回收:详细讲解了wait和waitpid函数的
2025-11-13 15:19:46
1034
原创 Linux学习日记10:静态库与动态库的制作
本文介绍了Linux系统中静态库和动态库的制作与使用。静态库(.a文件)在编译时嵌入程序,具有独立性强但体积大的特点;动态库(.so文件)在运行时加载,支持代码共享且体积小。文章详细说明了两种库的创建步骤:静态库通过ar指令归档目标文件,动态库使用gcc的-fpic和-shared选项生成。重点讲解了动态库的四种搜索路径配置方法:拷贝到系统目录、设置rpath路径、配置LD_LIBRARY_PATH环境变量或修改ld.so.conf文件。通过示例代码演示了两种库的完整创建与使用流程,并对比了它们的特性差异,
2025-11-01 11:28:27
1183
原创 Linux学习日记9:fflush函数、stderr、rewind函数,fprintf和sprintf行缓存,标准IO之feof、ferror和clearerr
本文系统介绍了Linux C编程中常用的文件I/O函数和流控制工具。重点讲解了缓冲区管理函数fflush的使用方法及其参数特性,分析了无缓冲的stderr标准错误流与行缓冲stdout的区别。详细说明了rewind函数的文件流重置功能,以及格式化输出函数fprintf和sprintf的应用场景。此外,还探讨了文件状态检测函数feof、ferror的使用方式,以及clearerr函数清除错误标志的作用。通过具体代码示例展示了这些函数在实际编程中的应用,帮助开发者更有效地进行文件操作和错误处理。这些工具对于保证
2025-10-30 20:38:23
1322
原创 Linux学习日记8:fputs、fgets、puts、gets、fputc、fgetc读写函数详解
本文介绍了C语言中常用的文件读写函数,包括fputs、fgets、puts、gets、fputc和fgetc。详细讲解了每个函数的基本定义、原型、参数和返回值,并通过具体示例验证其特性。如fputs的行缓冲特性可通过死循环验证;fgets比gets更安全;puts自动添加换行符;fputc不是行缓冲等。这些函数为文件I/O操作提供了不同层级的控制,使用时需注意缓冲机制和安全性问题。本文通过实际代码演示了各函数的正确用法,帮助读者深入理解它们的差异和应用场景。
2025-10-29 19:30:56
1092
原创 Linux学习日记7:fopen、fclose、fread、fwrite和fseek函数
本文系统介绍了Linux系统中标准I/O库的核心函数:fopen、fclose、fread、fwrite和fseek。通过对比底层系统调用,详细解析了这些函数的功能特性、参数用法和实现差异。fopen/fclose负责文件流的打开与关闭,fread/fwrite实现缓冲式读写操作,fseek则提供文件指针定位功能。文中通过具体代码示例演示了各函数的实际应用,并着重分析了标准I/O与系统调用在缓冲机制、返回值处理、跨平台性等方面的区别。文章最后强调正确使用这些函数需要注意错误处理、缓冲同步等问题,为开发者提供
2025-10-28 09:36:01
1360
原创 Linux学习日记6:文件IO与标准IO
本文介绍了Linux中文件IO与标准IO的区别。文件IO是底层系统调用,直接操作文件描述符,无缓存机制,需用户管理缓冲区;标准IO是C库封装的高层接口,内置库缓存,在遇到换行符或缓存满时自动刷新。通过示例代码演示了两者的差异:带换行符的printf能立即输出,而去掉换行符后由于缓存未刷新导致输出延迟,验证了标准IO的缓存特性。理解这两种IO的机制差异对Linux编程至关重要。
2025-10-26 19:30:12
623
原创 Linux学习日记5:CP指令的实现
本文介绍了Linux系统中的CP指令实现原理。首先讲解了main函数参数argc和argv[]的作用,为理解CP指令参数处理打下基础。然后详细说明了CP指令的基本语法、常用选项以及不同场景下的复制行为准则。最后通过代码示例展示了CP指令的实现流程:通过open函数打开源文件和目标文件,使用read/write函数循环读写数据,并最终关闭文件描述符。文章提供了一个完整的文件复制程序实现,验证了其功能与系统CP指令一致。
2025-10-25 14:44:24
1120
原创 Linux学习日记4:lseek函数
本文介绍了Linux系统中的lseek函数,该函数用于调整文件偏移量,决定后续read/write操作的位置。lseek函数原型为off_t lseek(int fd, off_t offset, int whence),参数包括文件描述符fd、偏移量offset(可正可负)和基准位置whence(SEEK_SET、SEEK_CUR或SEEK_END)。文章通过多个代码示例演示了不同基准位置的使用方法,并对比了lseek与O_APPEND标志的异同。lseek在文件操作中起关键作用,能灵活控制读写位置,而O
2025-10-23 21:48:33
1012
原创 Linux学习日记3:Write函数与Read函数
本文介绍了Linux系统中最基础的I/O操作函数write()和read()。write()用于向文件描述符写入数据,其参数包括文件描述符、数据缓冲区和写入字节数;read()用于从文件描述符读取数据,参数类似。两个函数都返回实际操作的字节数,0表示无操作,-1表示错误。文章通过示例代码演示了如何使用这两个函数完成文件读写操作,并提醒注意缓冲区大小需匹配数据长度以避免乱码问题。这两个函数是Linux系统所有高级I/O操作的基础接口。
2025-10-18 15:50:39
1171
原创 Linux学习日记2:open、close函数和文件权限
本文介绍了Linux系统中open和close函数的使用及文件权限管理。open函数用于打开/创建文件,返回文件描述符,支持多种模式(O_RDONLY、O_CREAT等);close函数用于关闭文件描述符。文件权限由9位字符表示(rwx),可用八进制数设置。通过示例演示了open/close函数的具体用法,并分析了O_CREAT模式下文件权限的设定规则,指出未指定mode时权限随机,明确mode参数后权限由mode&~umask决定。
2025-09-16 17:01:59
2246
原创 Linux学习日记1:了解Linux操作系统
本文介绍了Linux操作系统的基础知识及使用指南。主要内容包括:1)Linux发展历程与特点,重点阐述了其开源、多用户、高安全性等特性;2)Linux系统结构与典型应用场景,如服务器、嵌入式系统等;3)环境搭建指南,推荐使用Ubuntu发行版;4)核心操作命令详解,包括文件目录操作、vi编辑器使用和gcc编译器编译流程。文章通过对比Windows系统,帮助初学者理解Linux命令行操作的优势,并提供了详细的操作示例,如创建/删除文件、使用vi编辑代码、gcc编译程序等。适合Linux初学者快速掌握基础操作技
2025-09-15 15:20:19
1043
原创 C语言学习日记11:函数
本文系统讲解了C语言函数的相关知识。主要内容包括:1.函数的基本用法,包括函数定义、声明、调用、形参与实参的关系;2.函数的参数传递方式:全局变量、复制传递和地址传递;3.数组作为函数参数的两种传递方式;4.指针函数的概念和使用注意事项;5.递归函数的原理和实现;6.函数指针的定义和使用方法;7.函数指针数组的应用。文章通过多个代码示例详细说明每种概念的实现方式,帮助读者深入理解C语言函数的使用方法及其底层原理。
2025-09-10 15:42:37
1143
原创 C语言学习日记10:指针
C语言指针知识详解 指针是C语言的核心知识点,掌握指针是精通C语言的关键。本文系统讲解了指针的基本概念、运算规则及其应用场景: 指针基础 指针变量存储内存地址,通过*运算符访问目标数据 指针与数组关系密切,数组名即首元素地址 指针运算包括算术运算、关系运算和赋值运算 高级指针应用 二级指针用于处理指针数组 void指针可通过强制类型转换访问不同类型数据 const修饰指针可限制指针指向或指向内容的修改 典型应用场景 动态内存分配 高效处理数组和字符串 实现函数多返回值 构建复杂数据结构 通过大量代码示例,本
2025-08-28 20:11:29
2293
原创 C语言学习日记9:字符(串)数组和字符串函数
本文介绍了C语言中字符数组和字符串处理函数的使用。主要内容包括:1.字符数组的定义和初始化方法,强调以'\0'结尾的重要性;2.字符串数组的两种表示方式(字符指针数组和二维字符数组);3.常见字符串处理函数:strlen(计算长度)、strcpy(字符串复制)、strcat(字符串连接)、strcmp(字符串比较)及其用法;4.通过字符串逆序输出的实例演示这些函数的应用。文章还简要提及了字符串函数的扩展用法,如strncpy、strncat等。
2025-08-25 09:09:54
1148
2
原创 C语言学习日记8:数组
本文系统介绍了C语言数组的相关知识。首先讲解了一维数组的定义、内存存储方式、引用规则及初始化方法,并通过地址打印验证了数组元素的连续存储特性。重点演示了冒泡排序算法的实现过程。随后详细阐述了二维数组的定义、存储顺序和两种初始化方式,通过地址打印展示了二维数组按行优先的存储特性。最后简要提及多维数组的概念。文章通过代码实例直观展示了数组操作中的常见问题和注意事项,如数组越界、变量定义维数等错误情况。
2025-08-23 14:13:10
2188
原创 C语言学习日记7:控制语句
本文介绍了C语言中的控制语句,主要包括分支结构(if-else和switch语句)、循环结构(while、do-while和for循环)以及辅助控制语句(break、continue和return)。if-else语句通过条件判断执行不同代码块,switch语句适用于多分支选择。循环语句中,while先判断后执行,do-while先执行后判断,for循环适合已知次数的循环。辅助控制语句break用于跳出循环,continue跳过当前循环进入下一轮,return用于终止函数并返回值。文中通过具体代码示例(如数
2025-08-22 18:54:40
1190
原创 C语言学习日记6:输入输出
本文介绍了C语言的输入输出函数,包括字符输出函数putchar、格式化输出函数printf、字符串输出函数puts,以及字符输入函数getchar、格式化输入函数scanf和字符串输入函数gets。通过代码示例详细说明了各函数的使用方法、参数格式和注意事项,如scanf在VS2022中的安全设置、输入缓冲区垃圾清理技巧等。文章还解析了printf的格式控制符和scanf的抑制符*等特性,帮助读者掌握C语言标准输入输出的核心知识。
2025-08-21 08:56:33
797
原创 C语言学习日记5:运算符
本文详细介绍了C语言中的各类运算符及其用法。主要内容包括:1.算术运算符(+、-、*、/、%、++、--)及其运算规则;2.关系运算符(==、!=、>、<等)的比较功能;3.逻辑运算符(!、&&、||)及其短路特性;4.位运算符(~、&、|、^、<<、>>)的二进制操作;5.赋值运算符(=、+=等)的使用;6.特殊运算符(三目运算符、逗号运算符、sizeof)的应用;7.各类运算符的优先级规则。通过多个代码示例演示了各运算符的具体使用方法和运算结果
2025-08-19 09:22:51
890
原创 C语言学习日记4:常量与变量
本文介绍了C语言中的常量与变量。常量包括整型常量(十进制、八进制、十六进制)、浮点常量(一般形式和指数形式)、字符常量(以ASCII码存储)、字符串常量(以'\0'结尾)和标识常量(用#define定义)。变量则需要预先说明存储类型(auto、register、static、extern)和数据类型,其命名需遵循特定规则。文章通过代码示例展示了各种常量的表示方法及变量存储类型的特点,如static变量的持久性和register变量的高速访问特性。这些基础知识是C语言编程的重要基础。
2025-08-16 09:40:20
1225
原创 C语言学习日记3:原码、反码和补码和基本数据类型
前面我们学习了C语言的基础语法知识,相信大家对C语言有了初步的认识,这次我们来学习C语言的基本数据类型以及原码、反码和补码的相关知识。如图所示,C语言的数据类型包括基本类型、构造类型、指针类型和空类型。本次我们学习基本类型,其他的后面再一一解说,有兴趣的可以提前了解一下。数据在计算机中表示的形式称为机器数,其特点是采用二进制计数制,数的符号用0、1表示,小数点隐含表示而不占位置。机器数对应的实际数值称为数的真值。无符号数是指全部二进制位均代表数值,没有符号位。
2025-08-12 17:04:43
1290
原创 C语言学习日记2:C语言基础语法知识
本文介绍了C语言基础语法知识,包括主函数main的作用和结构、自定义函数的编写与调用方法。通过一个简单的加法函数示例,讲解了函数声明、参数传递和返回值的使用。文章还解释了变量、标识符、关键字和字面常量的概念,以及printf函数的格式化输出功能。最后说明了#include指令的作用,用于引入系统头文件。这些内容为C语言初学者提供了基本的编程概念和语法规则。
2025-08-10 21:39:19
612
原创 C语言学习日记1:了解C语言
C语言是1978年由贝尔实验室开发的程序设计语言,1983年ANSI制定了标准C规范。其特点是高效、结构化、可移植性强,支持指针操作和底层硬件控制,广泛应用于系统编程和嵌入式开发。C语言采用面向过程编程思想,强调步骤化解决问题。环境搭建方面,推荐使用Visual Studio等IDE,通过创建控制台项目并添加C++源文件(兼容C语法)即可开始编程。学习C语言通常从经典的"Hello World"程序入手,需注意编译后再运行程序的开发流程。
2025-08-10 11:13:16
1021
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅