- 博客(32)
- 收藏
- 关注
原创 Linux网络编程——TCP并行服务器
多线程实现:每当有客户端连接时,服务器创建一个线程来处理该连接。适合连接数适中的情况,但线程数过多时可能会带来性能问题多进程实现:通过fork()创建子进程来处理每个客户端。I/O 多路复用(select)实现:服务器通过select等待多个客户端的事件,适用于大量客户端连接,且无需为每个连接创建线程或进程。select使用位图管理文件描述符,最多允许同时监测1024个文件描述符(有上限);文件描述符集合在应用层创建,需要实现应用层和内核层的反复拷贝;需要应用层对集合表进行遍历,寻找到达的事件;
2025-03-06 18:35:49
727
原创 网络编程——http
在Linux系统中使用C语言实现HTTP客户端或服务器通常涉及使用套接字编程和一些HTTP协议的基本知识。下面是一个简单的示例,展示了如何用C语言实现一个HTTP客户端,向一个HTTP服务器发送请求并接收响应。这个例子展示了如何用C语言通过TCP连接到HTTP服务器,发送HTTP请求并打印出响应。(示例为火狐新闻主页面)使用send()函数将构造好的HTTP请求发送到服务器。使用recv()函数接收服务器的HTTP响应。使用close()函数关闭套接字,释放资源。1. HTTP客户端示例 (C语言)
2025-03-04 19:00:49
637
原创 网络编程——TCP
accept()用于接收客户端的连接请求,并返回一个新的套接字,这个新的套接字用于与客户端的数据交互。使用 socket() 系统调用创建套接字,指定协议族(AF_INET)和协议类(SOCK_STREAM,表示TCP)。服务器和客户端使用send()函数发送数据,使用recv()函数接收数据。服务器端使用 accept() 接受客户端的连接请求,并返回一个新的套接字用于与客户端通信。连接建立后,双方可以使用 send() 和 recv() 进行数据的发送和接收。6.数据传输 (Send/Recv)
2025-03-03 19:21:18
605
原创 网络编程——UDP
Linux下的UDP网络编程通过 socket()、sendto() 和 recvfrom() 等系统调用实现数据发送和接收。接收数据:服务器通过 recvfrom() 接收客户端发送的数据,recvfrom() 可以返回发送数据的客户端地址信息。创建套接字:使用 socket() 创建UDP套接字,指定地址族 AF_INET 和套接字类型 SOCK_DGRAM。无连接特性:UDP是无连接的,这意味着客户端和服务器不需要建立连接,只要有目标地址和端口,数据就可以发送。1.使用 sendto() 发送数据。
2025-03-02 18:56:36
1571
原创 Linux系统下基于mplayer的媒体播放器
本项目的目标是设计并实现一个基于 MPlayer 的简单媒体播放器,能够在 Linux 系统下播放音视频文件。MPlayer 是一个强大的开源媒体播放器,它支持几乎所有的音视频格式,并且具有高度的可定制性。该项目旨在为用户提供一个具有基本功能的图形界面播放器,支持多种音视频文件的播放和简单的用户交互。
2025-02-28 19:21:45
607
原创 进程与线程(四)——进程间通信
C语言提供了多种进程通信机制(如管道、信号、消息队列、共享内存、信号量和套接字),每种方法都有其特定的应用场景。选择合适的通信方法取决于进程间数据传递的需求、性能考虑和同步要求。
2025-02-24 19:14:06
752
原创 进程与线程 (三)——线程间通信
C语言中线程间的通信方法涉及不同的同步机制,如互斥锁、条件变量、信号量、消息队列等。每种方法适用于不同的场景,选择合适的同步机制可以有效地确保线程间的协作和数据一致性。使用这些同步工具时,需要特别注意避免死锁、饥饿等问题,确保程序的正确性和性能。
2025-02-22 17:10:27
360
原创 进程与线程 (二)
1.pthread_join具有阻塞功能,线程不结束,一直等到线程结束,回收到线程空间再继续向下执行。进程间任务的切换需要映射到不同的物理地址空间,频繁切换资源开销大。线程间任务的切换是在同一片进程空间内部完成任务切换,资源开销小。进程是操作系统资源分配的最小单元(进程:文本段+数据段+系统数据段)线程异常崩溃导致进程崩溃,该进程中的其余线程异常结束。2. 其余的文本段、数据段、堆区都是与进程及进程内的其余线程共享的。2. 僵尸线程:等到线程结束需要回收线程空间,否则会产生僵尸线程。
2025-02-21 17:56:57
1224
原创 进程 (一)
vfork() 与 fork() 不同,它不复制父进程的地址空间,子进程运行在父进程的地址空间中。让父进程先结束,子进程会成为孤儿进程,被init进程收养,子进程结束时,init进程回收子进程空间。fork() 创建一个新的进程,这个新进程是父进程的副本。证子进程先于父进程运行,并且父进程会在子进程调用 exec() 或 exit() 之后才可能被调度运行。内核:操作系统核心区域,用户无法访问,负责内存管理,CPU管理,硬件设备管理,进程。进程就是程序执行的过程,包括创建,调度和消亡,是活的。
2025-02-20 21:06:45
242
原创 Linux软件编程——IO编程 (DAY 3)
打开文件用户调用open()系统调用。内核通过vfs_open()查找文件并返回文件描述符。读取文件用户调用read()系统调用。内核通过vfs_read()获取数据并拷贝到用户空间。写入文件用户调用write()系统调用。内核通过将数据写入文件系统。调整文件指针用户调用lseek()系统调用。内核通过调整文件的读写位置。open():打开文件,返回文件描述符。read():从文件读取数据。write():向文件写入数据。lseek():调整文件的读写位置。练习;
2025-02-17 22:24:34
722
原创 Linux软件编程——IO编程,stdio (DAY 2)
在 C 语言的 I/O 编程中,stdio.h是标准输入输出库,提供了许多用于处理输入和输出的函数。以下是一些常用的stdio。
2025-02-15 19:49:46
571
原创 Linux软件编程——IO编程 (DAY 1)
1. 库函数是对系统调用的封装,用户调用库函数并不能完成对应的功能,而是要由库函数。3. 用户可以通过Linux系统提供的系统调用直接调用内核中的接口。1. Linux内核中的函数接口,称为系统调用。在 Linux 软件编程中,I/O(输入/输出)编程是核心部分,涉及文件、设备、网络等数据源。b block块设备文件(用来存储,用块储存设备信息)i (link,链接文件,与某个文件链接)练习:从终端接收两个文件的名字,将第一个文件中的内容拷贝到第二个文件中。
2025-02-14 19:49:23
371
原创 数据结构——二叉树、哈希表 (DAY 6)
二叉树是一种常见的数据结构,由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。数据通过哈希算法映射成唯一键值,存储在键值对应的位置,读取时可以根据键值快速读取。:除了最后一层,其他层都是满的,且最后一层的节点尽可能靠左。:每个节点的左子节点和右子节点分别构成左子树和右子树。:左子节点的值小于父节点,右子节点的值大于父节点。:根节点 -> 左子树 -> 右子树。:左子树 -> 根节点 -> 右子树。:左子树 -> 右子树 -> 根节点。:树的顶部节点,没有父节点。:至少有一个子节点的节点。
2025-02-13 21:00:49
427
原创 数据结构——栈和队列 (DAY 5)
3. 入栈:将数据插入栈顶位置。栈和队列只允许在固定位置取出或者插入数据。2. 栈底:不允许入栈出栈的一端称为栈底。1. 栈顶:允许入栈出栈的一端称为栈顶。队列:先进先出,后进后出 FIFO。栈:先进后出,后进先出 FILO。4. 出栈:将数据从栈顶位置取出。5. 栈针:栈顶元素所在的位置。栈和队列是一种特殊的表状结构。
2025-02-11 20:26:03
163
原创 数据结构——双向链表,内核列表 (DAY 4)
今天学习了双向链表,他与单项链表的不同在于他的每个单元之中多了一个指针指向前一个单元。普通链表:链表节点中包含数据。内核链表:数据中包含链表节点。能够查询某个联系人信息。能够打印所有联系人信息。1.利用内核链表编写一个手机通讯录。
2025-02-10 23:05:06
147
原创 数据结构——单向链表 (DAY 3)
今天学习了单向链表的倒置,冒泡排序和选择排序以及单向链表的销毁和环形链表,学会了三种调试方法:打印法,core文件调试,以及vscode调试。
2025-02-09 21:49:15
107
原创 数据结构——单向链表 (DAY 2)
今天学习了makefile的用法,使用valgrind 内存泄露检测工具判断空间是否泄露,同时学习了单向链表的定义,创建,头插法,遍历,查找元素,替换元素以及尾插法。= 如果原来没值,就赋值为新值,如果原来有值保留原来的值。$@: 要生成的文件。$<: 第一个依赖的文件。3. += 在原来的内容后面拼接新的内容。makefile中要生成多个目标,需要设定伪目标。生成伪目标使用:make 伪目标名称。6. makefile中的伪目标。4. makefile中的变量。要生成的目标文件:依赖的文件。
2025-02-07 20:21:09
347
原创 数据结构——顺序表 (DAY 1)
今天使用编写工程代码的方式使用C语言完成了顺序表的创建,追加元素,局部插入元素,删除元素,判断是否有某元素,替换某个元素等功能。编译时加后缀 -g 使用时:ghb ./a.out。fun.h: 功能程序代码头文件;fun.c: 功能程序代码;main.c:主函数程序代码;b 行号/函数名 设置断点。p 变量名 查看变量的内容。s 进入函数内部调试。顺序表功能程序代码头文件:seqlist.h。顺序表功能程序代码:seqlist.c。主函数代码:main.c。
2025-02-06 20:18:25
271
原创 C语言——共用体、枚举、位运算 (DAY 14)
union:共用体与结构体定义元素访问相同,但是结构体成员变量内存空间是独立的,共用体成员变量空间是共享的。C语言被执行后,操作系统分为不同的区域(堆和栈用来存放数据的区域)返回值:成功返回申请到的堆区空间首地址;栈区:存放局部变量,变量定义时申请空间,超过作用域回收空间。堆区:malloc申请空间,free释放空间。堆区空间很大的,可以用来存放超过8M的数据。栈区空间有限,申请超过8M空间程序崩溃。malloc(申请空间大小);& 按位与;malloc函数:申请堆区空间;
2025-01-23 18:49:17
209
原创 C语言——指针和数组关系,结构体
结构体成员变量只能存放在内存地址为自身基本类型长度整数倍的内存单元中。数组的数组名为指向第一个元素的指针常量(列指针)数组的数组名是指向数组第一行的数组指针(行指针)结构体整体的大小必须为最大类型长度的整数倍。3. 结构体元素访问(结构体访问成员变量的最终类型由成员变量决定)(2)结构体指针变量访问成员变量:“->”(1)结构体变量访问成员变量:“ . ”数据类型1 变量1;封装一个函数传入日期获得这一天为该年的第几天;封装一个函数判断传入的一年是否为闰年;封装一个函数获得该年剩余的天数;
2025-01-22 20:01:16
277
原创 C语言——指针(三) (DAY 12)
输入格式: 输入第一行给出一个正整数 N(≤ 100),随后 N 行,每行给出一个用户设置的密码,为不超过 80 个字符的非空字符串,以回车结束。从终端输入要输入的n行字符串,将其依次送入sizeup函数中判断,首先利用strlen函数获得长度,如果长度小于六直接输出:Your password is tai duan le.const修饰*p,p可以改变,*p不可以改变;const修饰p,p不可以改变;如果密码长度合法,但存在不合法字符,则输出Your password is tai luan le.;
2025-01-21 20:23:35
1448
原创 C语言——指针(二) (DAY 11)
注意:不能返回局部变量的地址,指针函数可以让函数的返回值作为下一个函数的参数,实现嵌套调用。1,封装函数分别实现strlen, strcpy,strcat和strcmp的功能。指针函数:指针函数是函数,函数返回值是指针。1. 字符型数组和字符串串传参。
2025-01-20 19:59:03
119
原创 C语言——指针(一) (DAY 10)
(只有变量能“&”操作,&具有类型升级的效果,将int->int*)提供一种对变量的间接访问,通过找到变量的存储位置来操作变量。数组的数组名类型理解为int*型(除sizeof()和&运算)地址传递:将实参的地址传给形参,形参是指向实参的指针,可以利用形参修改实参的值。*:获得指针对应空间的值,根据指针类型来决定取得的字节数。(2)地址:用来区分内存中不同字节的编号,称为地址;(1)内存:存放数组的空间,以字节来编址;(3)指针:指针就是地址,地址就是指针;算术运算:+-++--
2025-01-19 20:03:13
398
原创 C 语言——函数 预处理命令 (DAY 9)
带参宏#defineMAXNUM(x,y)((x)>(y)?值传递:函数体内部使用函数体外部变量的值时,使用值传递,实参将值传给形参,形参是实参的副本,形参变化不会影响实参的变化。一次移动一个盘子,只能小盘子放在大盘子上,怎样将n个盘子全部从A移动到C,可借用B.要想将其全部移动到C,我们需要将A上n-1层移动到中间B上,再将A上最后一层移动到C,再将B上n-1层移动到C即可完成整个过程。-c将代码执行“预处理”“编译”“汇编”三步;-S将代码执行“预处理”“编译”两步;
2025-01-18 21:08:45
600
原创 C语言——函数 (DAY 8)
通过调用leap_year函数判断是否为闰年,闰年则函数返回1,平年返回0。在主函数定义一个变量ret接收函数leap_year的返回值,根据返回值输出该年份为闰年或平年。static静态存储(静态区)(限定变量作用域,防止多文件全局变量重名)auto局部存储,自动型存储(栈区)(存储类型不写,默认为auto)函数名(数据类型1形参1,数据类型2形参2,...)(形参可省略)函数类型函数名(数据类型1形参1,数据类型2形参2,...)
2025-01-17 20:45:42
153
原创 C语言——数组:字符型数组 (DAY 7)
首先输入一行字符串,利用strlen获得字符串长度len,从str[0]开始与str[len-1-i](即字符串最后一位(除‘\0外’))交换位置,交换len/2次即可实现将整个字符串逆序排列。1. 获得字符串的长度 (从开头到 \0 中间元素的个数(不包含\0))注意:没有给定初值的元素默认为0值,也就是'\0',注意不是'0'strcat (数组1, 字符串(数组2));strcpy(数组1,字符串(数组2));strcmp(数组1,字符串(数组2));gets:从终端接收一行字符串。
2025-01-15 19:16:27
376
原创 C语言——一维整形数组 (DAY 6)
首先利用for循环从终端向数组中赋值,首先将a[0]的值作为最小值,依次和数组后面的值比较,如果a[0]比其中一个数小,将这个数和a[0]交换,就将最小值放在a[0];首先定义两个数组,a数组为原正常排序数组,因为如果要给原数组加一个数会产生越界,因此我们定义数组b,将数组a的值放入b中,如果输入的数小于其中一个值,将该位置的数换为输入的数Num,再依次将原数值后移一位。依次得到最终的顺序。2.数组内元素个数必须有限;第一行为输入的数,第二行为a数组的值,第三行为b数组的值,即题目要求要得到的结果。
2025-01-14 21:07:19
122
原创 C语言基础——流程控制:循环结构 (DAY 5)
要实现题目要求我们需要两个for循环嵌套,内层循环求1到20每个数的阶乘,再通过外层循环将阶乘和相加得到最终结果。在内层循环结束后,n内的值为当前i值的阶乘。要让它装下一次i值的阶乘,必须要在i值加1进入下一次内循环前将n的值重新赋值为1。除此之外还要注意n和sum定义时的数据类型,因为最终得到的结果较大,使用int型4个字节不足以存储最终结果,导致最终结果有误。do while循环不可以和for循环(while循环)相互转化,即使不满足while里面的条件也会执行一次语句块。int型(出错结果)
2025-01-13 20:39:34
147
原创 C语言基础——输入输出函数,流程控制(DAY4)
给出100分制成绩,要求输出成绩等级为'A','B','C','D','E'.100分到90分为‘A’,89分到80分为'B',79分到70分为'C',69分到60分为'D',59分及以下为'E';表达式1:表达式2;(判断逻辑表达式值为真或假,为真则将表达式1的值作为整个式子最终的值,为假则将表达式2的值作为整个式子最终的值)1.除了%s不需要加“&”,其它必须要加“&”。puts(str);//str为字符数组;2.数据类型必须匹配。gets(str);3.switch语句。2.switch语句。
2025-01-12 19:44:41
210
原创 C语言基础——运算符输入输出函数(DAY3)
分别对他们进行除以十和对十求余的操作可以获得它们个位和十位上的数,再根据要求给每个数乘以相应权值,即可得到所要得到的新数。右值:能够放在等号右边的值(可以为常量、变量、常量变量组成的表达式)左值:能够放在等号左边的值(只能为变量,不能是常量或者表达式)逗号表达式会将最后一个表达式的结果作为整体表达式的结果。如果小数据放入大空间,补符号位(正数补0,负数补1)赋值是内存空间的拷贝,如果空间大小一样则直接拷贝。Num1的个位作为新数的千位。Num2的个位作为新数的百位。Num1的十位作为新数的十位。
2025-01-11 20:52:59
156
原创 C语言基础——数据类型·常量和变量·算术运算符(DAY 2)
首先,我们定义五个变量c1,c2,c3,c4,c5,令他们的初值分别为'C','h','i','n','a'。根据ASCII码表知,'G','l','m','r','e'f分别与其在十进制中相差4,我们只需要给其加4即可得到Glmre。" + " " - " " * " " / " " % "(求余) " ++ "(变量自增,每次增加一)" -- "(变量自减,每次减一)double 双精度 8个字节(一位符号位+11位指数位+52位尾数位)(1)常量(程序运行中值不发生变化)
2025-01-10 19:48:01
310
原创 自学Linux操作系统(DAY 1)
普通用户家目录为/home/用户名,超级用户家目录为/root(普通用户用户名不为root,超级用户用户名为root);(10)mv命令:完成文件移动(或用作修改文件名)。(1) ls命令:查看当前目录下所有文件;(8) rm -rf命令:删除非空目录;(2) mkdir命令:创建空目录文件;(3) rmdir命令:删除空目录文件;(4) touch命令:创建普通文件;(5) rm命令:删除普通文件;(9) cp命令:完成文件拷贝;1、了解Linux操作系统的基础操作。(6)cd命令:进入某个目录;
2025-01-09 19:52:43
229
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人