- 博客(40)
- 收藏
- 关注
原创 FrameBuffer
是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作控制fb。<linux/fb.h>中还提供了专门的结构体类型,用来存放上述两个参数,如下就是存放可变参数的结构体类型。对映射区域的写入操作会产生一个映射文件的复制,即对此区域的任何修改都不会写回原来的文件内。0x4602 //获取固定的参数(如屏幕的分辨率,一般只是拿来看看)对映射区域写入的数据会复制回源文件内,而且允许其他映射该文件的进程共享。
2024-09-10 20:35:56
1009
原创 树(tree)和哈希算法(Hash)
在记录的存储位置和它的关键字之间建立一种去特定的对应关系,使得每个关键字key对应一个存储位置;查找时,根据确定的对应关系,找到给定的key的映射。一般用大O表示法:O(n)-----时间复杂度是关于数据n的一个函数。其他节点只有一个前驱节点,但可以有多个后继节点。记录的存储位置 = f(关键字)我们把这种关系f称为哈希函数(散列函数);任意一个节点的子节点个数不能超过2个(树的度为2),且子节点的位置不可更改。在不增加树的层数的前提下,无法再增加一个节点的二叉树。n个互不相交的树的集合。
2024-09-09 19:51:25
1130
原创 数据结构:栈和队列(Stack & Queue)
栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。栈顶(Top):线性表允许进行插入删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端。空栈:不含任何元素的空表。栈又称为先进后出、后进先出的线性表,简称FILO结构队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出、后进后出的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
2024-09-06 20:58:06
1154
原创 数据结构
一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,并在此基础上实现某个特定的功能的操作;程序 = 数据结构 + 算法。
2024-09-04 20:51:53
281
原创 嵌入式数据库
create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);(1)功能:打开一个数据库文件获得操作数据库文件的句柄,如果数据库存在,则打开;column_name :查询结果每个字段的字段名称首地址集合。(1)功能:在使用sqlite3_exec函数时,每查找到一条数据,调用一次回调。column_value:查询结果每个字段的首地址集合。INSERT INTO 表名称 VALUES(值1, 值2,....);
2024-08-29 21:26:54
1396
原创 TCP并发服务器
EPOLL_CTL_MOD 修改事件。3)返回值:成功返回非负值:表示epoll事件表对象(句柄);op: EPOLL_CTL_ADD 新增事件。1)功能:监听事件表中的事件,并将产生的事件存放到结构体数组中。判断文件描述符fd是否仍在文件描述符集合中。epfd:事件表文件描述符。(1)功能:监听文件描述符集合中的事件。1)功能:创建一个监听事件表(内核中)1)功能:在监听事件表中新增一个事件。(1)功能:设置文件描述符属性。(1)功能:监听文件描述符集合。
2024-08-28 21:24:53
2305
原创 TCP的连接建立及报文段首部格式
TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项(N是整数))。2)或(or):ip.src == 192.168.1.100 or ip.dst == 192.168.1.102。1)与(and):ip.src == 192.168.1.100 and tcp.dstport == 9999。(2)根据端口过滤: tcp.srcport == xx;(1)根据IP地址过滤:ip.src == x.x.x.x ip.dst == x.x.x.x。
2024-08-23 20:15:45
691
原创 基于UDP/TCP的 c/s 通信模型
(1)功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。int flags, // 0 默认的接收方式 --- 阻塞方式。struct sockaddr *src_addr, //用来保存发送方的地址信息。(1)功能:该函数固定有客户端使用,表示从当前主机向目标主机发起链接请求。(2)通信过程:(read;
2024-08-22 19:27:13
2422
原创 网络编程
主机号是子网内每台主机的编号。直接使用二进制数,不容易记忆,为了方便记忆,将32位二进制码划分为4个字节,每个字节转化成相应的十进制数,字节之间用“.”来分隔,这种表示方法,称之为“点分十进制表示法”。(2)内核层 传输层----------这些层次 操作系统已经实现。int flags, //0 --- 默认。(1)用户层 应用层 ---------程序员。:域 (范围) ---socket 用于什么范围的通信,ipv4 / ipv6;
2024-08-21 21:22:29
1261
原创 IPC通信方式
信号量最初是对资源的一种抽象和模拟,最初的信号量(整型信号量),就是通过一个数值,来表示某种资源的个数,在你这个抽象的基础上,他的发明者。放)来实现对互斥资源的访问,后来处于对(1).多个临界资源的访问,(2)和资源使用数量的限制(在有些情况下,当资源数量低于某一下限值时,便不予分配).信号量的概念得到进一步发展,形成了所谓的”信号灯集”.: 申请的共享内存访问权限,八进制表示(如果是第一个申请,则用IPC_CREAT;(3)返回值:成功: 返回映射的地址,一般等于shmaddr;:(0 :表示读写;
2024-08-21 20:00:28
924
原创 有名管道和信号
(2)参数:a)signum:要处理的信号的编号(不能被阻塞,处理[SIGKILL] 忽略[SIGSTOP]);b)sig:当前程序要发送的信号编号 《=== kill -l。(1)功能:在指定的pathname路径+名称下创建一个权限为mode的有名管道文件。(1)功能:通过该函数可以给pid进程发送信号为sig的系统信号。(2)参数:a)pathname:要创建的有名管道路径+名称;有名管道===》fifo===》有文件名称的管道。(2)参数:a)pid:要接收信号的进程pid;
2024-08-17 20:42:17
1245
原创 线程
需要自己回收 ---线程的属性 (可结合性) --- 一般是子线程 在较短时间内运行完 .这种用于线程任务较短,主线程需要关心子线程状态。可分离属性 ---子线程运行很久才结束 --- 设置分离属性,子程序执行任务较长,主线程也不需要关心子线程状态。静态初始化:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;互斥锁 -- 保证线程对于共享资源的排他性访问。定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁。
2024-08-16 12:57:22
1090
原创 线程
多线程程序设计:可以包括专门的线程进行资源申请和初始化、执行处理程序以及进行资源释放。线程间通信:由于线程共享进程资源,需要注意线程间的通信和同步,以保证数据的正确性和安全性。通过合理使用线程,可以提高程序的并发性能,但在使用过程中需要注意线程的安全性、稳定性和调试等问题。希望本文对大家理解和使用Linux中的线程有所帮助,如有不足之处,欢迎大家指正。
2024-08-14 19:56:00
529
原创 父子进程、exec函数族
(wait/waitpid --- 查看子进程的退出状态)进程执行结束但空间未被回收变成僵尸进程。(2)参数:status 进程退出时候的状态如果不关心其退出状态一般用NULL表示。(3)以e结尾的函数,可以传入一个指向环境字符串的指针数组的指针。用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),新进程,所以调用exec前后该进程的id并未改变。这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错。当进程调用一种exec函数时,该进程的。
2024-08-13 19:54:49
1053
原创 进程
进程会分配内存资源(如栈、堆、静态区等)和CPU资源,具有程序状态的变化,可以并发执行,并且进程之间会竞争计算机的资源。例如,在服务器程序中,通过创建多个进程可以同时处理多个客户端的请求,提高服务器的响应能力。之前,则子进程会继承父进程已打开的文件的相关信息(文件表项),此时父子进程共享(文件表项),实现对同一个文件的操作;之后各自打开,则父子进程各自拥有各自的文件描述符及对应的文件表项,各自独立操作该文件,可能存在文件内容被覆盖的情况。是程序执行的过程,包括进程的创建、调度和消亡,是。
2024-08-12 21:04:36
808
1
原创 用户和组信息、系统时间获取,错误处理和Makefile
返回值:成功返回 ID 对应用户的信息,失败返回。:成功返回保存日历时间结构体的指针,失败返回NULL。返回值:成功返回 0,失败返回 -1。返回值:成功返回 0,失败返回 -1。返回值:成功返回 0,失败返回 -1。返回值:成功返回 0,失败返回 -1。:成功返回1970年到现在的秒数,失败返回 - 1。:成功返回获得时间字符串的首地址,失败返回NULL。功能:将一个老的路径名改为新的路径。返回值:成功返回组信息,失败返回。返回值:成功返回对应的错误信息。功能:创建一个硬链接文件。开辟特殊长度内存空间。
2024-08-08 20:24:54
1131
原创 文件属性获取及目录操作
返回值:包含文件信息的结构体,出错或者读到目录流末尾返回NULL。返回值:成功返回包含路径空间的字符串首地址,失败返回NULL。功能:从目录流中读取文件信息并将保存信息的结构体地址返回。返回值:成功返回目录流指针,失败返回NULL。返回值:成功返回0,失败返回 - 1。功能:打开一个目录获得一个目录流指针。返回值:成功返回0,失败返回 - 1。返回值:成功返回0,失败返回 - 1。返回值:成功返回0,失败返回 - 1。返回值:成功返回0,失败返回 - 1。功能:获得当前的工作路径。功能:获得文件的属性。
2024-08-07 20:38:49
1008
原创 标准IO和文件IO
在标准IO中,不同的缓存机制适用于不同的场景,以提高数据处理的效率和性能。全缓存适用于文件读写,能够减少系统调用的次数,提高数据传输的效率;在操作系统中,为了方便用户使用系统功能,系统对外提供了一组系统函数,称为系统调用,其中包括文件IO。文件IO是一种基于Linux内核的没有缓存的IO机制,主要用于对设备文件和普通文件进行操作。(3)对普通文件进行标准IO操作时,建立的缓存一般为全缓存。3.返回值:成功返回读到数据的个数,失败返回 - 1,读到文件结尾返回0。(2)不缓存数据,直接将数据输出或处理。
2024-08-06 19:57:08
1016
原创 标准IO操作、函数接口和缓冲区
一般都是对普通文件操作,是一种有缓存的IO在文件IO和用户程序之间加入缓冲区,可以有效减少系统调用的效率,节省系统IO调度资源。eg : ====》stdio.h ===>stdio.c==>libc.so ==>/usr/lib so 动态库。ANSIC 设计的一组用文件IO封装的操作库函数头文件:stdio.h 标准输入输出头文件。< > :是系统库函数,默认路径在/usr/include/(1)fwrite写文件。(1)fputc读文件。(1)fputs读文件。(2)fread读文件。
2024-08-05 19:40:30
1091
原创 Linux shell脚本配置
shell脚本的本质就是一系列shell命令的集合。练习:从终端接收两个数,并打印出这两个数四则运算的结果。例如:每隔五个输出从20至100的数。
2024-08-03 19:54:05
2217
原创 共用体、枚举类型、typedef定义,位运算
位运算(所有位运算要操作数的类型是与整形或者整形兼容,或者枚举也可以;但是指针,结构体这些都不可以,不与整形兼容)共用体所有成员变量,所占空间重叠,占共同的空间。用来声明新的类型名来达到给予类型的作用。数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;右移(算术右移,右移一位该数除以2)union 共用体名。将变量的值一一列举出来。enum 枚举类型名。
2024-08-02 20:39:14
588
原创 结构体
C语言允许用户自己定义一种数据结构,称为结构体。声明一个结构体类型一般形式为:strcut 结构体名成员列表int id;//";"不能丢失int i;s.id = 1;return 0;//部分初始化。
2024-08-01 19:33:13
734
原创 指向指针的指针
一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数的指针。表示定义一个指向函数的指针变量p,他不是固定指向哪一个函数的,只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。例如:int a[10] = {1,2,3,4,5,6,7,8,9,0};&a:指向长度为10的一维int数组的地址。一个数组,若其元素均为指针类型数据,称为指针数据,其每一个元素都相当于一个指针变量。char *为基类型,*为类型说明符,p为指针变量。指的是一个指针变量,该变量的值为另一个指针的地址。
2024-07-31 19:38:55
571
原创 字符串与指针
在内存空间使用完时,应该对该空间进行销毁采用的函数为(free)(空指针传给free函数并不会导致错误);如果请求的空间不够用应采用realloc函数延申开辟的空间,销毁原来的空间;该指针所指向的地址不可更改;但可以通过该指针去修改该地址的变量的值;无法通过该指针再修改它所指向的变量,该指针所指向的变量不能作为左值;需要更大的空间时就需要请求一块更大的内存,这样的内存区在堆区;不能通过指针P来修改i的值,只可读而不能修改(问接访问时);1024*1024*8是栈区内的最大内存空间。字符串有效长度的计算。
2024-07-30 21:00:11
292
原创 指针变量
指针:指针则是一个特殊的变量,它存储的是内存地址。通过指针,我们可以间接地访问到指针所指向的内存地址中的数据。地址:在计算机内存中,每个存储单元都有一个唯一的地址,就像我们现实生活中的门牌号码一样。通过这个地址,我们可以找到相应的存储单元,从而访问其中存储的数据。函数调用时,一般为值传递,因此不能直接访问,需要通过指针来取地址进行间接访问,从而能够在被调函数中修改主调函数。指针变量只能存放地址(指针),不能将一个整数或任何其他非地址类型的数据赋给一个指针变量。指针是用来装地址的数据类型。
2024-07-29 18:47:28
359
原创 局部变量和全局变量、预处理命令
局部变量在一个函数内部定义的变量,只在本函数范围内有效。全局变量可以为本文件中其他函数所共用,其有效范围为从定义变量的位置开始到本源文件结束。
2024-07-27 21:39:57
1047
原创 数组作为函数参数
(3)在被调用函数中声明了形参数组的大小,但在实际上,指定其大小是不起任何作用的,因为C语言编译对形参数组大小不做检查,只是将实参数组的首元素的地址传给形参数组。因此,形参数组名获得了实参数组的首元素的地址,数组名代表数组的首元素的地址,因此,形参数组首元素和实参数组首元素具有同一地址,它们共占同一存储单元指的是同一单元。但是不能省略第二维以及其他高维的大小说明。由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素当然可以作函数实参,与用变量作实参一样,是单向传递,即“值传送”方式。
2024-07-26 20:01:53
610
原创 函数递归调用
1.在定义函数中指定的形参,在未出现函数调用时,它们并不占用内存中的存储单元,只有在发生函数调用时,函数中的形参才会被分配内存单元。在调用结束后,形参所占的内存单元也会被释放。通常是用于那些在编译期间就能确定存储大小的变量的存储区,但它用于的是在整个程序运行期间都可见的全局变量和静态变量。bss段:未初始化的全局变量和未初始化的静态变量存放在**.bss段**。在调用一个函数的过程中又直接或间接的调用该函数,称为函数的递归调用。在被定义的函数中,必须指定形参的类型,实参与形参的类型应当相同或赋值兼容。
2024-07-25 20:27:00
521
原创 二维数组、函数
1.所有的执行都是平行的,即定义函数时分别进行,互相独立,函数不能嵌套定义。2.从用户使用的角度来看,函数可分为标准函数和自定义函数两种,标准函数即库函数,由系统提供,自定义函数为用户自己定义的,用以解决用户专门需要的函数。3.从函数的形式来看可分为无参函数和有参函数。无参函数是有参函数的特殊形式。int max;max = c;return max;
2024-07-24 20:42:44
1127
原创 C语言字符数组
fgets(s,sizeof(s)/sizeof(s[0]),stdin):将回车也作为有效字符输入,导致结果出现liang'ge'huan'ha。若初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符。,此时数组c的长度会自动定为字符串的长度加1(因为字符串常量的最后由系统加上一个'\0'字符数组是用来存放字符数据的数组,其定义方式与其他类型数组类似,例如。如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。在C语言中,字符串是作为字符数组来处理的,例如。
2024-07-23 19:55:33
525
原创 一维数组(排序)
类型说明符 数组名[常量表达式];如int a[10];数组的命名规则和变量名相同,定义数组时,需要指定数组中元素的个数,"[]"中的常量表达式用来表示元素的个数,即数组长度。数组元素的表现形式为数组名[下标],下标可以是整型常量或整型表达式。特点:1.单一性:数组中各元素所占字节大小都相同。2.有序性:下标小的元素总靠前,放在下标大的元素之前(地址)。3.连续性:各元素之间在内存中存放时没有间隔。选择排序:在数组合适的位置上放上合适的数。
2024-07-22 21:34:22
576
原创 循环控制语句
while循环中,只在while后面的括号内指定循环条件,因 此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i++,或i=i+ 1等)。for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作 全部放到表达式3中。(4)while循环、do·while循环和for循环,可以用break语句跳出循环,用continue 语句结束本次循环。若表达式结果为非零(真)时,返回重新执行循环语句,反复进行,直到表达式的值为0时,循环结束。时,执行while语句中的内嵌语句。
2024-07-20 17:42:01
696
原创 选择结构程序设计
条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表 达式3的值就是整个条件表达式的值。逻辑表达式的值是一个逻辑量“真”或“假”,在C语言中,表示逻辑运算结果时,1表示真,0表示假。如上表(逻辑运算的真值表)所示:在(a&&b)中,若a为假,其值为假;在(a||b)中,若a为真,其值为真,出现。在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”。关系表达式的值为一个逻辑值,即“真”或“假”。
2024-07-19 21:22:32
634
原创 顺序程序设计、输入与输出
缓冲区:(FIFO)先进先出,如果代码处要求输入四个字符,而只写了两个字符,此时按回车并不会结束,而是要在输入一个字符,按下回车相当于一个"\n"(换行)。(4)对于scanf的字符输入,若格式控制串中无非格式字符,所有输入字符均有效;(1)输入/输出的数据类型要与格式字符严格匹配,否则可能导致错误或未定义的行为。putchar(c)输出字符变量c的值,c可以是字符型变量或整型变量。(5)复合语句:用{}将一些语句括起来成为复合语句(分程序)(1)控制语句(C只有9种控制语句)
2024-07-18 20:16:47
569
原创 变量赋初值、各类数值型数据间混合运算
初始化:在程序运行时执行本函数时赋初值,相当于有一个赋值语句int a = 0;在声明一个变量的时候指定变量的值,这叫做初始化。int a;a = 2;这叫做赋值。编译器只对确定类型进行检查;类型转换是否能够成功无明确判断,编译时or运行时。lvalue[left(locatable)value]变量,能放到运算符的左边。地址可取。rvalue[right(readable)value]常量,只能放到右边,所有的临时变量(匿名变量)都为右值。地址不可取。
2024-07-17 18:55:13
417
原创 整型、浮点型、字符型数据类型
整型常量表示:在C语言中,有三种形式:十进制整数整型变量:数据在内存中以二进制形式存放。数值以补码表示:正整数的补码与该数的原码相同;负数的补码为其绝对值的二进制形式按位取反再加1。有符号[signed],无符号[unsigned]
2024-07-16 18:41:23
1061
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人