- 博客(62)
- 收藏
- 关注
原创 Linux网络编程-网络基础概念(IP, UDP协议)
本文介绍了网络编程的基础知识,主要包括以下内容:1. 网络通信的基本概念和网络协议分层模型(OSI七层模型和TCP/IP四/五层模型);2. IP地址的格式、组成和分类,包括特殊的IP地址如网段号、广播号和网关地址;3. 端口号的作用和分类;4. 网络协议栈中各层的功能;5. UDP协议的特点和网络编程模型(C/S和B/S)及编程流程。文章系统地阐述了计算机网络通信的基本原理和关键要素。
2026-06-15 20:17:44
186
原创 Linux系统编程-信号2
本文介绍了Linux信号处理机制中的信号集操作和信号捕捉技术。主要内容包括: 信号集操作函数 内核通过未决信号集判断信号处理 信号屏蔽字可影响未决信号集 使用sigemptyset、sigfillset等函数操作信号集 sigprocmask函数用于获取/修改信号屏蔽集 sigpending函数读取未决信号集 信号捕捉机制 signal和sigaction函数注册信号处理程序 sigaction结构体详解信号捕捉特性:临时屏蔽、不支持排队等 内核实现信号捕捉的流程,应用实例:使用SIGCHLD信号回收子进程
2026-06-13 18:51:12
481
原创 Linux系统编程-进程间通信IPC(SysⅤ:消息队列、共享内存)
本文介绍了System V消息队列和共享内存两种进程间通信机制。消息队列部分详细说明了相关函数:ftok获取key值、msgget创建/获取消息队列、msgsnd发送消息、msgrcv接收消息(支持按类型筛选和截断处理)、msgctl控制队列(删除/获取属性)。通过两个示例展示消息队列的使用,包括结构化数据传输和终端输入转发。共享内存部分讲解了shmget创建共享内存、shmat建立映射、shmdt解除映射、shmctl删除内存等函数,强调其高效性(减少数据拷贝)。
2026-06-13 11:11:54
321
原创 Linux系统编程-进程间通信(管道、共享内存)
本文系统介绍了Linux环境下的进程间通信(IPC)机制,重点分析了管道和共享内存映射两种核心方法。 一、进程间通信概述 IPC基本概念。 二、管道通信详解 管道特性:伪文件(内核缓冲区)、半双工通信、仅适用于有血缘关系进程。 三、FIFO有名管道。允许无血缘关系进程通信,mkfifo命令/函数创建,需同时打开读写端,演示了半双工和全双工通信模型。四、共享内存映射。mmap机制:将文件映射到内存,直接通过指针访问。全文通过代码示例详细展示了各种IPC技术的具体应用,并对比分析了不同方法的适用场景和优缺点。
2026-06-10 19:23:39
364
原创 Linux系统编程-信号量(线程同步机制)
本文系统介绍了Linux系统中的信号量机制及其应用。主要内容包括:1)信号量的定义与作用,其作为受保护的整数计数器,通过P/V操作实现进程/线程间同步;2)信号量与互斥锁、条件变量的区别,信号量具有计数功能且无所有权概念;3)信号量相关API函数(sem_init、sem_wait、sem_post等)的功能与使用方法;4)通过银行取钱和生产者-消费者两个实例演示信号量的实际应用。生产者-消费者模型通过产品数和空格数两个信号量实现环形队列的同步控制,展示了信号量在多线程编程中的重要价值
2026-06-09 18:46:49
242
原创 Linux系统编程-线程、互斥锁与多线程模块的封装
文章主要介绍了线程的基本概念及其与进程的区别,并详细讲解了线程相关的函数接口(如pthread_create、pthread_exit、pthread_join、pthread_detach)的使用方法及注意事项。同时,阐述了线程互斥机制,重点讲解了互斥锁(pthread_mutex)的使用流程(初始化、加锁、解锁、销毁),并通过模拟ATM取钱的代码示例展示了多线程环境下临界资源的保护机制。全文内容涵盖了线程的创建、同步、资源回收及互斥访问等核心知识点。
2026-06-08 20:33:11
210
原创 Linux系统编程-会话、守护进程与系统日志
本文介绍了Linux系统中的进程组、会话和守护进程概念。主要内容包括: 进程组是多个进程的集合,组长进程终止不影响进程组存在; 会话是多个进程组的集合,通过setsid()创建新会话; 守护进程是后台服务进程,创建步骤包括:fork子进程、创建新会话、改变工作目录、重设文件掩码、关闭文件描述符等; 守护进程通过系统日志(syslog)记录运行信息,使用openlog()、syslog()和closelog()函数进行日志操作。文章通过示例代码演示了相关API的使用方法和实际应用场景。
2026-06-07 21:24:34
563
原创 Linux系统编程-文件管理与UFS文件系统
本文详细介绍了Linux系统中进程与文件管理的核心数据结构及其关系。主要内容包括: 进程管理结构体,文件描述符表, 文件管理结构体,进程通过文件描述符→file结构体→inode三级结构访问文件 图示了文件共享、多次打开和dup操作时结构体的变化。同时也详细介绍了UFS这个文件系统:UFS文件系统组织方式(块组、inode位图等),inode的多级索引机制(直接/间接指针),目录文件的存储结构及其路径解析原理等等。
2026-06-06 09:59:26
412
原创 Linux系统编程-进程回收
本文介绍了进程回收相关的系统调用和exec函数族。主要内容包括: 进程回收函数wait()和waitpid()的使用方法,包括阻塞/非阻塞模式、状态获取等; exec函数族的实现原理和主要区别(execl/execv/execlp),用于替换当前进程的代码段执行新程序; system函数的实现原理及自定义实现方法。文中通过示例代码演示了如何正确使用这些函数进行进程控制和程序替换操作。
2026-06-05 18:46:16
215
原创 Linux系统编程-进程及相关指令与函数
本文介绍了进程的基本概念及相关操作。进程是运行中的程序,具有生命周期,是操作系统分配资源的最小单位。文章详细讲解了进程的创建过程、调度算法(如时间片轮询、优先级调度等)以及进程的不同状态(运行态、就绪态、等待态等)。同时介绍了进程相关指令(如ps、kill、pstree等)的使用方法,以及进程控制函数fork()的工作原理和父子进程的关系。特别强调了孤儿进程(父进程先结束)和僵尸进程(父进程未回收子进程资源)的产生机制及处理方法。最后总结了进程退出的三种方式(return、exit()、_exit())
2026-06-04 20:35:01
226
原创 Linux系统编程-标准I/O与系统I/O的比较
文章对比了标准I/O和系统I/O的核心差异。标准I/O由C库提供,使用文件流指针和缓冲区,提高效率但降低实时性;系统I/O由内核提供,直接使用文件描述符,无缓冲区但实时性强。重点分析了标准I/O的三种缓冲模式(行缓冲、全缓冲、无缓冲)及其刷新机制,并通过代码示例演示了缓冲区行为。特别介绍了fflush()函数强制刷新缓冲区的功能,以及标准I/O通过合并系统调用提升性能的原理,使用strace工具验证了系统调用合并现象。
2026-06-03 19:19:54
179
原创 Linux系统编程-系统I/O与其他
本文介绍了Linux系统I/O操作的基本概念和函数接口。主要内容包括:1) 文件描述符是系统为已打开文件分配的非负整型标识符(0-1023),遵循最小未使用原则分配;2) 系统默认打开三个标准文件描述符(STDIN/STDOUT/STDERR);3) 详细说明了open、close、write、read等系统调用函数的使用方法及参数说明;4) 通过一个文件复制示例程序演示了这些系统调用的具体应用,实现了类似cp命令的功能。文中还涉及文件权限设置(umask)和常见标志位(O_RDONLY等)的解释说明。
2026-06-02 19:04:54
243
原创 数据结构-内核链表
内核链表是Linux内核中的双向循环带头节点链表,其核心特点是将链表节点嵌入宿主结构体而非直接存储数据,实现类型无关性。关键组件包括:struct list_head节点结构、初始化宏与函数、插入/删除操作,以及安全遍历宏。通过container_of宏可从节点指针反推宿主结构体地址,支持高效类型安全遍历。重点阐述了通过container_of宏从链表节点反向获取宿主结构体的原理,并提供了完整的示例代码演示内核链表的使用流程。最后讨论了static inline修饰函数的作用:既避免符号冲突又提升性能
2026-05-31 19:13:33
273
原创 数据结构-排序算法
本文介绍了常用的排序算法与查找算法,比如冒泡排序,插入排序,选择排序,希尔排序,快速排序,堆排序,归并排序,二分查找,详细介绍了每种排序算法的思想与时间,空间复杂度,并且给出了每种算法的代码实现。
2026-05-30 18:14:19
728
1
原创 Linux系统编程-条件变量
本文介绍了条件变量的概念及其在多线程编程中的应用。条件变量是一种线程同步机制,通常与互斥锁配合使用,用于线程间的通信。文章详细讲解了条件变量的主要操作函数,包括初始化、销毁、等待和通知函数等,并强调了pthread_cond_wait()函数解锁和阻塞等待的原子性操作的重要性。此外,文章通过生产者消费者模型的代码实现,展示了条件变量的实际应用,并指出在多消费者场景下需要注意的虚假唤醒问题。最后,文章建议在消费者逻辑中使用while循环而非if判断来避免因虚假唤醒导致的逻辑错误和段错误。
2026-05-29 10:16:42
736
原创 数据结构-树与二叉树
本文系统介绍了树与二叉树数据结构。主要内容包括:1)树的基本概念,包括根节点、分支节点、叶子节点等术语;2)二叉树的定义及两种特殊类型(满二叉树和完全二叉树);3)二叉树的四种遍历方法(前序、中序、后序的深度优先遍历和层序的广度优先遍历)及其实现代码;4)二叉树的基本操作实现,包括销毁、获取节点数和最大深度等。文章通过C语言代码示例展示了二叉树的具体实现方法,为理解和应用这一重要数据结构提供了详细参考。
2026-05-28 20:14:00
239
原创 数据结构-队列,循环队列,哈希表
本文介绍了队列、循环队列和哈希表三种数据结构及其实现方法。首先详细讲解了队列的FIFO特性,包括链式队列的创建、入队、出队等操作实现。其次分析了循环队列解决假溢出的原理,给出其判空判满条件及实现代码。最后阐述了哈希表的存储原理,重点介绍了链地址法解决哈希冲突的方法,并提供了哈希函数设计、查找、插入等操作的实现代码。全文通过C语言代码示例,系统性地展示了这三种常用数据结构的具体实现方式。
2026-05-27 18:33:16
370
原创 Linux系统编程-读写锁
读写锁是一种支持更高并行性的同步机制,具有写独占、读共享的特性。它提供两种加锁模式:读锁允许多线程并发读取,写锁则独占访问。读写锁适用于读操作远多于写的场景,并遵循写优先原则。文章详细介绍了读写锁的状态特性、主要操作函数(初始化、销毁、加解锁等)及其使用注意事项,并通过示例代码演示了3个写线程和5个读线程对共享资源的访问控制。特别指出在多线程编程中,全局变量的操作顺序可能受编译器影响,不同编译器可能产生不同结果。最后强调读写锁能有效协调多线程对共享资源的访问,提高程序并发性能。
2026-05-26 20:05:00
535
原创 数据结构-栈
本文主要介绍了栈的概念、分类及实现方式。首先阐述了栈"先进后出"的特性,区分了内核栈(包括满栈/空栈、增栈/减栈)和数据结构中的栈(顺序栈/链式栈)。然后详细讲解了栈的C语言实现,包括栈对象和节点的创建、判空、入栈、出栈、获取栈顶元素、遍历打印和销毁等操作。最后解释了malloc/free的内存管理机制,指出操作系统内部通过维护地址-大小映射表来管理堆内存,并建议free后对指针置空以避免野指针问题。全文系统地介绍了栈这一数据结构从理论到实践的关键知识点。
2026-05-26 18:46:29
245
原创 Linux系统编程-线程同步
本文介绍了线程同步的概念及其重要性。线程同步指多个线程按预定顺序协调运行,避免共享资源访问冲突导致的数据混乱。文章分析了数据混乱的三个原因:资源共享、调度随机和缺乏同步机制,并提出使用互斥锁(mutex)作为解决方案。详细讲解了Linux中mutex的五个核心函数及其使用注意事项,包括初始化、加锁、解锁和销毁操作。通过代码示例展示了正确使用锁的方法,并指出锁的粒度应尽可能小。最后讨论了两种常见的死锁情况:同一线程重复加锁和多个线程循环等待对方持有的锁,并给出了相应的示例代码。
2026-05-25 19:22:20
509
原创 数据结构-单链表与双链表
本文介绍了单链表和双链表的基本操作实现。单链表部分包含查找中间节点(快慢指针法)、查找修改节点、查找倒数第k个节点、三种反转方法(头插法、三指针法、递归法)、插入排序以及判断链表是否有环。双链表部分详细展示了链表结构定义、创建销毁、头插尾插、头删尾删、查找修改等操作,并实现了插入排序算法。所有代码示例均包含必要的边界条件检查,如空链表处理和单节点特殊情况处理。这些基础操作是链表数据结构的核心内容,为更复杂的链表应用提供了基础支持。
2026-05-25 18:47:44
113
原创 Linux系统编程-线程属性
linux下线程的属性是可以根据实际项目需要,进行设置,之前讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。
2026-05-24 09:34:11
491
原创 C语言-Linux系统下的俄罗斯方块实现
本文介绍了基于VT100终端控制的俄罗斯方块游戏实现。主要内容包括: VT100终端控制基础 使用VT100控制码实现光标移动、颜色设置等终端操作 通过\033[31;41m等代码设置前景色和背景色 游戏核心实现 使用二维数组构建游戏边框和俄罗斯方块图形 实现方块移动、旋转、碰撞检测等核心逻辑 采用定时器控制方块自动下落 实现消行判断和计分功能 关键技术点 坐标系统设计考虑终端x/y轴比例 通过信号处理实现定时下落动画 使用7种基本方块及其19种变形状态 解决初始化、变形显示等实现中的关键问题
2026-05-23 09:19:17
678
原创 数据结构-链表
Valgrind 是 Linux GNU提供的一个内存错误检查软件,核心用途是内存调试内存泄漏检测线程错误检测性能分析。在程序运行过程中检查内存错误。3.2 安装方法。
2026-05-22 19:50:33
411
原创 C语言-动态内存管理
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。对malloc申请的内存空间一定要free不然会内存泄漏。若系统内存空间使用紧张,则free后的空间立马被使用,数据被覆盖。
2026-05-19 17:57:53
352
原创 C语言-位操作
位操作只支持整型与字符类型。应用:1、两数交换2、数据传输过程中,校验(CRC)左移:高位丢弃,低位补零a<<n,相当a*2的n次方高位补零,低位丢弃。a>>n,相当a/2的n次方。高位补符号位,低位丢弃。
2026-05-19 12:41:13
223
原创 C语言-函数栈帧 Stack frame
在写C语言代码的时候,经常会把一个独立的功能抽象为函数,故C程序是以函数为基本单位的。那函数是如何调用的?函数的返回值又是如何待会的?函数参数是如何传递的?这些问题都和函数栈帧有关系。函数栈帧)就是函数调用过程中在程序的调用栈call stack)所开辟的空间,这些空间是用来存放:1、函数参数和函数返回值2、临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)3、保存上下文信息(包括在函数调用前后需要保持不变的寄存器)。
2026-05-18 19:14:22
719
原创 C语言-结构体、共用体、枚举
1、联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)2. 作为函数参数传递的时候,如果参数本身有多个选项的时候,所有的选项,以联合体形式给出。定义一个自定义的变量,把变量可以取到所有的值,列举出(或者说一个取值的范围)来。1. 需要节省内存空间的情况 (如果可以使用结构体,或联合体)这种类型定义的变量包含一系列的成员,特征是。定义的标识符比较枚举有类型检查,更加严谨。的时候,就要对齐到最大对齐数的整数倍。,所有成员的起始地址相同。
2026-05-18 17:42:58
303
原创 Linux系统编程-信号
A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。Linux内核的进程控制块PCB是一个结构体,task_struct, 除了包含进程id,状态,工作目录,用户id,组id,文件描述符表,还包含了信号相关的信息,1. 当信号产生后,未决信号集中描述该信号的位立即反转为1,表示信号处于未决状态,当信号被处理后,立即反转为0。将某些信号加入集合,对他们设置屏蔽,当屏蔽某信号后,再收到该信号,该信号的处理将推后,直到解除屏蔽后。
2026-05-16 09:20:55
622
原创 C语言-结构体
结构体是一种自定义数据类型。结构体在声明是不开辟内存空间,在定义时才开辟内存空间。结构体运算符:.:结构体成员运算符,左侧是一个结构体变量。->:结构体成员运算符,左侧是一个结构体指针。注意:在对结构体中的name[20]进行赋值时,不能使用=赋值,而应该使用strcpy函数。
2026-05-15 18:36:19
209
原创 Linux系统编程-进程与进程控制
fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。将当前进程的.text、.data替换为所要加载的程序的.text、.data,然后让进程从新的.text第一条指令开始执行,但进程ID不变。内核的PCB仍存在。父进程先于子进程结束,这个子进程称为孤儿进程,这个子进程的父进程变成init进程,称为init进程领养的孤儿进程。我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是。
2026-05-14 20:50:57
717
原创 C语言-指针数组与数组指针
结果: &p[4][2] - &a[4][2] 得到的是指针之间的元素个数(同一数组中,指针-指针得到的是指针之。1、sizeof(数组名):这里数组名表示整个数组的大小,计算的是整个数组的大小。间的元素个数) 可知结果是-4,本题的关键点在打印的格式,以%d的格式打印出-4,若以。2、&数组名:表示取出整个数组的地址,加1跳过整个数组的大小。2) 如果在被调函数中,需要修改指针指向的内容(指针指向的变量数据)。数组指针:对一个一维数组进行&操作,地址值不变,类型升级为指向整个数组的指针。
2026-05-14 18:48:01
409
原创 C语言-字符串指针与函数指针
原因://这是一个字符指针,p指向的是一个字符串常量,只可读,存储在数据区的.rodata中,且在内存中只存储一份。// 这是定义的一个数组,里面存放的是hello这个字符串,存储在栈区中,可读可改。
2026-05-13 18:50:17
311
原创 C语言-指针二
int *p :对p取地址,结果是一个二级指针:int **(二级指针,地址的地址)指针是保存地址的 变量,指针保存的地址,不能发生变化)。2. 函数的返回值只有一个。使用函数的传址调用也可以在函数内部修改特定的值,方便在主调函数中的使用。传值调用则不行,因为形参是实参的一份临时拷贝,修改形参并不会改变实参。:形参是实参的地址,形参指向实参的内存地址,可以通过形参来改变实参。给函数一个地址,在函数内部对其进行修改,之后可以在主调函数中访问。:函数的形参是实参的一份临时拷贝,修改形参不会改变实参。
2026-05-12 18:21:30
224
原创 C语言-指针
/只能指向整形变量的地址char *pc;//野指针//空指针//空指针,逻辑上先指向地址为0处的空间,稍后给一个合理的//地址int a = 10;pi = &a;//正常初始化return 0;注意:1、指针也是有类型的2、在定义指针时,同时初始化为NULL或者0,防止野指针。1、指针未初始化,指向的内存地址随机2、指针指向的变量内存空间被释放。
2026-05-11 18:00:23
492
原创 Linux系统编程-makefile文件与make命令的使用
Makefile 是一个用来自动化编译程序的 “脚本文件”,配合 make 命令使用,极大地提高了软件开发的效率。make是一个自动编译工具,它会读取当前目录下的 Makefile,然后自动编译程序。如果在一个项目中有多个 .c 源文件,则使用gcc命令编译时会很麻烦:使用makefile文件与make命令可以极大的提高效率。本文所有的例子都是基于这个简单的加减乘除多文件项目。
2026-05-10 18:15:35
847
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅