- 博客(33)
- 收藏
- 关注
原创 数据库
DELETE FROM 表名称 WHERE 列名称 = 值(与create相似)UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值。3.select 列名 from 表名称 查找该列名的数据 (若为*则查找所有数据)1.create table 表名称(列名1 类型,列名2 类型......)创建表。sqlite:嵌入式数据库,开源免费,代码量少,文件型数据库可以移动,最大2T。4.where :1.用于特定条件的数据查找 where 列/运算符/值。
2024-08-29 21:51:26
308
原创 TCP并发服务器
多进程流程:socket()---bind()---listen()---accept() ---fork()阻塞IO:fgets,scanf,read,recv,getchar(用来实现多个IO同步的效果)TCP实际上是单循环的服务器,只能建立一对一连接,其他人不能再与其建立连接,之前只有一个套接字。信号驱动IO:实现:(当终端有输入的时候应该会触发,发射信号,才会执行)非阻塞IO:非阻塞就是访问内核,有数据带着数据返回,没有数据也带着返回。特点: 1、异步通知io的方式,节省CPU。
2024-08-27 22:53:13
455
原创 TCP/UDP的对比,粘包分包抓包,http协议
当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个 HTTP 请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个 HTTP 响应。注意: 当我们访问一些网页时,是显示通过 HTTPS 来进行通信的,并且当下大多数的网页都是通过 HTTPS 来进行通信的,因为 HTTPS 在 HTTP 的基础上做了一个加密的工作。协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。(2)指定要发送的数据的长度。
2024-08-23 20:40:48
1353
原创 TCP、UDP
如此理解connect三个参数是容易了,我必需指定数据发送的地址,同时也必需指定数据从哪里发送,这正好是connect的前两个参数,而第三个参数是为第二个参数服务的。addr:发送到哪,服务端的地址,connect是主动连接的一方,要存在一个被动连接的一方需要调用listen以接受connect的连接请求,被动连接的一方就是服务器。accept:当客户端的连接请求到达后,accept函数会创建一个新的套接字,并返回一个新的套接字描述符,该描述符与客户端的套接字建立连接。*addr:存储客户端的地址信息。
2024-08-22 21:50:09
824
原创 进程间的共享内存,socket编程
IPv6是较新的版本,由128位二进制数组成,以冒号分隔的十六进制表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。共享内存是一种高效的进程间通信(IPC)机制,它允许两个或多个进程共享一个给定的存储区。删除共享内存:最后,当所有进程都不再需要共享内存时,创建共享内存的进程或拥有足够权限的进程可以删除共享内存段,释放资源。分离共享内存:当进程不再需要访问共享内存时,它会从自己的地址空间中分离共享内存段,这通常通过shmdt函数实现。
2024-08-21 23:20:05
691
原创 信号量和管道
如果信号量的sem值小于等于0,则P操作就会阻塞,如果信号量的值大于0,才可以执行p操作进行减1。参数:pipefd :获取管道的两端:读端:pipefd【0】,写端pipefd【1】参数:sem:信号量地址 返回值:成功返回0,失败返回-1。参数:sem:信号量地址 返回值:成功返回0,失败返回-1。功能:将信号量的值减1,若信号量的值小于等于0,此函数会引起调用者阻塞。(1)P操作:表示使用这个资源,资源个数减一。功能:执行v操作,执行一次,信号量的值加1。
2024-08-16 20:59:50
652
原创 线程的退出、资源回收,互斥锁
僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。(1)互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束;终止进程法(包括终止所有死锁进程和逐个终止进程): 终止系统中的一个或多个死锁进程,纸质打破循环环路,使系统从死锁状态中解脱出来。(2)占有且等待:一个进程本身占有资源,同时还有资源未得到满足,正在等待其他进程释放该资源。如果互斥锁已被其他线程锁定,调用线程将被阻塞,直到互斥锁被解锁。
2024-08-15 21:37:13
996
原创 进程wait&waitpid、线程
wait功能1、获取子进程退出状态,分析子进程是否已经退出(变成僵尸态)2、回收资源,让僵尸态子进程销毁wait本身是一个阻塞操作,会使调用者阻塞2、宏:(1)WIFEXITED(status):w if exit ed 判断是否为正常退出如果子进程正常终止,调用exit(),或从main函数中返回,返回值为真(2)WEXITSTATUS(status):w eixt status 获取exit传递的状态值返回子进程退出状态,只有当WIFEXITED返回为真的时候使用这个宏。
2024-08-14 19:45:20
839
原创 进程的执行与结束
程序替换函数,通常不父进程去执行,而是交给子进程执行,因为这也子进程可以做它的事,父进程也可以做自己的事,由于进程之间的独立性,即使子进程去执行execl函数时候,替换的也是子进程的代码和数据,而父进程的代码和数据是不会被影响的。父进程在它的执行代码中调用进程等待的方法,等待子进程退出,防止子进程变成僵尸进程实质:子进程保存了自己的进程退出码给父进程,父进程获取了退出码后才能释放子进程资源。进程程序替换并不会创建新的进程,它只会加载程序的代码和数据,去替换原来的进程!成功:返回处理的退出的子进程的pid。
2024-08-13 22:05:51
699
原创 目录函数以及链接文件
显示方式:0(默认值)、1(高亮)、22(非粗体)、4(下划线)、24(非下划线)、5(闪烁)、25(非闪烁)、7(反显)、27(非反显)前景色:30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋红)、36(青色)、37(白色)背景色:40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、45(洋红)、46(青色)、47(白色)\033[0m 默认 \033[1;40m 033[1;参数: oldpath:要链接向的文件 newpath:创建的新硬链接文件。
2024-08-08 20:23:28
869
原创 文件目录。
判断权限 进行位运算,在其mode 里面由=有32位,低9位就是 实际上的权限位置,我们进行系统里面的宏运算,进行位运算,来判断其权限。读取目录:readdir:返回值是info(目录中的一项内容),type表示类型是目录。mode有32位,7位用宏判断是哪个类型,9位判断666,777。2、chdir 改变当前路径:chdir ../返回上级路径。输出的是所有文件,包括隐藏文件(“.”,“..”)4、mkdir 创建一个目录,权限是777.参数: pzath: 文件的路径。打开目录:opendir。
2024-08-07 21:40:53
154
原创 标准IO定位,读写
其中有一个 文件IO,一般都是对设备文件操作,当然也可以对普通文件进行操作。2、操作对象不再是流(FILE*),而是文件描述符(int 0-1023)SEEK_END 指向最后一个字节的后一个,继续加,写文件,会将文件扩大。文件复位,等效于 fseek(stream, 0, SEEK_END)文件IO 是一个基于Linux内核的没有缓存的IO机制。count 写入字符的个数(填写buf的有效长度)count 要读到数据的个数(可比实际的内容略大)通过文件描述符读取文件中的数据。成功 返回文件描述符(fd)
2024-08-06 21:06:29
666
原创 标准输入输出
1,打开->> FILE * fp 2,读写->> IO 3,关闭->> fclose。I :键盘是标准输入设备 ==》默认输入就是指键盘 /dev/input。so:动态库函数(共享库),(公共的,用得很多),在user中存储。标准io:stdio.h(计算机角度做输入输出)(读写文件)w+ 只写 文件不存在报错 文件存在则清0写读打开。w 只写 文件不存在报错 文件存在则清0只写打开。r+ 读写 文件不存在报错 文件存在则读写打开。r 只读 文件不存在报错 文件存在则只读打开。一般都是对普通文件操作。
2024-08-05 21:05:09
486
原创 shell脚本
普通文件,d目录,b块设备,c字符设备,h儿软链接(快捷方式),p管道,s网络文件(套接字)作者权限,读,w写,x执行 组用户(批量用户管理)-b文件名,-e判断文件是否存在,-d目录,-l软连接(快捷方式),-普特文件,-s套接字。test ,【】语句格式如下,还有比较 -gt,-ge,-lt,-le,eq;$$:当前shel的PID(正在运行的程序的编码)脚本为弱类型语言,不需要定义类型,默认为字符型。""双引,打印字符串,遇到$变量则打印变量中值。''单引,打印字符串,遇到$变量依然打印$变量。
2024-08-03 19:35:19
542
原创 链表尾插法、头删、尾删,共用体、位运算。
union 共用体名(首字母大写。所占字节大小:结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。但是整体大小和最大的对齐。共用体的特点:(1)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。(2)不能在定义变量的时候初始化,不能对共用体变量赋值,不能用共用体变量对别的变量赋值。(3)共用体内部成员的地址是一样的。
2024-08-02 19:55:53
606
原创 结构体和共用体
预处理命令#pragma pack(n)可以强制编译器按照n的长度来对齐,n的值1,2,4,8,16.。部分初始化:.s1 = 10,用逗号隔开下一个.s2 = 20。使用指针传参,传指向的地址只需要8个字节的空间。值传递需要复制,需要建立和删除内存。char s【100】,按基类型的大小对齐,占100字节不是104。刷新输出缓冲区:\n,fflush(stdout),等待缓冲区满。如果访问的是地址,可以使用“->”符号。全部初始化:按声明的顺序输入值。\r退回最前端,\b退回上一格。
2024-08-01 20:08:03
515
原创 字符串与指针,指向函数的指针,指数函数的指针
a[0]和*(a+0)等价,a[1]和*(a+1)等价,a[i]和*(a+i)等价。不能将*(a+1)+2错写成*(a+1+2),后者变成*(a十3)了,相当于a[3]。若getMem(s)未取地址,则s为野指针,s的基类型为char*型,指针传参时,形参需要一个指针*p来接受,getMem函数中,char*为基类型,*只是为了说明p为一个指针。*(*(a+0)+1)或*(* a+1)也是a[0][1]的值。*(a[i]+j)或*(*(a+i)+j)是a[i][j]的值。
2024-07-31 21:18:51
250
原创 指针与数组
分配动态内存,参数为,需要的内存空间大小的字节,申请的字节一定是连续的,返回需要空间的首字节地址(申请的空间在堆区),如果申请成功,返回空间的首字节地址,申请失败,返回一。需要手动归还,归还与申请的首地址要相同,释放结束后,置于空指针(NULL)未销毁,称为内存泄漏。迭代器([begin,end]):通过前一个元素找到了下一个元素(++),基于数组的有序性。const 修饰*p(i),无法通过该指针修改指向的变量i,处于只读不能写。返回值为指针的函数,不能返回局部变量,其动态生存区被销毁。
2024-07-30 20:59:31
329
原创 指针你到底干了什么
1、类型 *指针变量名;*是类型说明符。2、int i = 100(直接访问);int *p;p = &i;*p = 100(间接访问);直接访问在被调函数中不能修改主调函数,所以创造了指针。指针变量指向地址i;整型:装整数的数据类型;指针:装地址的数据类型。指针变量名,字母下划线开头不能是数字。3、*和&运算符;*是指针运算符文,&是取地址运算符。二者都是自右向左如下图:&i是地址,*访问地址i内的内容;*p是访问地址i的内容,&拿地址;&p是i的地址的地址,*这个访问地芷的地址。
2024-07-29 19:44:38
946
原创 函数和预处理命令
{}以外的,不放在任何{}里面的变量称为全局变量(例子 g_i),使用范围为从定义开始到文件结束(静态区){},局部作用域里声明的标识符(局部变量)只能作用于所在的{}里,作用域外对标识符赋值将会报错(栈区)4.在两个或两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见(就近原则)预处理阶段,会在程序段1观察宏名是否定义过,若没有定义,则为无效,执行else。即寄存器变量,将变量定义为寄存器(存储器,CPU内部)变量,提高读写速率。即自动变量,变量的空间的开辟和销毁为自动的。
2024-07-27 22:56:12
243
原创 函数
数组传参是指针传参,可以修改给出地址中的数据,即可以在被调函数中修改主调函数。如sizeof(s),由于s为数组名又代表数组首元素地址,所以只有8字节。在C语言中数组作为函数参数,只传递数组地址,需要再传参数:数组元素个数。int a【10】他的数据类型就是int 【10】占40个字节。二维int型和char型数组需要传递rows,也要把列数写上。一维char型数组因为'\0'存在,不需要传递数组长度。现在定义int s【】或者int s【】【】后;一维int数组传参时需要传递数组长度。
2024-07-26 22:05:30
129
原创 函数和递归
函数传递都是值传递,而不是修改内存空间,形参的值是开辟另外一个与实参大小相同的 内存空间并把实参的值复制进去,修改也只是修改形参空间的值,不影响实参。主函数执行到函数时会跳转到函数中开始执行,在执行到return后,返回主函数继续执行。不允许在函数传参中对变量进行自增、自减,否则会出现错误。pc进入函数后无法返回函数调用处,就产生了栈。实质:不能在被调函数中修改主调函数的值。函数递归:函数直接或间接调用自己本身。函数传参的顺序自右向左。3、从编译器,底层逻辑看函数怎么调用的。
2024-07-25 20:57:36
383
原创 二位数组与函数
1、C程序的执行是从main函数开始的,如是在main函数中调用其他函数,在调用后流程返回到 main函数,在main 函数中结束整个程序的运行。所有函数都是平行的,即在定义函数时是分别进行的,是耳相独立的,一个函数并不从属于另一个函数,即函数不能嵌套定义。return 语句应该与函数的类型一致,没有写return则结果不确定,运行到return会终止,返回主调函数的调用处。计算行列数:a[0]表示一维数组的数组名,a表示数组的首元素地址,a[0]的首元素地址。(一维中s为数组名,s[]为下标运算符)
2024-07-24 21:31:15
612
原创 字符数组...
({}可以省略),其中包含’H’,‘e',’l',’l',‘o',‘\0’。带*的是指针,取的地址。1、puts(数组名),puts(const char *s)字符型变量的地址。2、strcpy字符串拷贝,s1为源,s2为目标 strcpy( s2,s1)2、\0是字符串结束的标志,字符串的结束并不依赖于长度信息,而是通过检测到。1、strlen 统计字符串有效字符长度:‘\0’之前的长度不包括‘\0’。3、strcat()拼接字符串,目标,源;1、scanf("%s",s)输入字符串。
2024-07-23 18:45:59
182
原创 数组和数组算法
给数组a 排序,创建一个新的数组,把a数组的数拿出来,装到b数组里面,但是要保证数组是。连续性:排放中间没有分隔,是连续的:1000 2000 3000 4000;2、赋值:int a【】 ={123456789};出现数组元素没有的元素,a【】={0,1,2,3},{0,1,数组不能被初始化:否则输出除初始化的元素其余都是0。相邻两个元素两两比较,判断是否需要互换位置;a【i】代表一个数组元素,不能被初始化。1、定义:类型名 数组名【数组大小】a【0】:代表数组中第一个元素的地址;3、数组元素存放的;
2024-07-22 21:41:13
309
原创 循环结构
(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。1、break:可以从循环体内跳出循环体,提前结束循环,在循环嵌套语句中break语句的作用通过在花括号的位置来判断。2、goto 语句标号:语句标号要用标识符(由字母,下划线开头,并由字母,数字,下划线组成)表示:goto + 标识符;表达式2是判断循环条件的,不能去掉,否则会认为循环条件恒为真。循环变量初始化语句、循环的执行条件、使循环趋于结束的语句。(5)循环结束,执行 for 语句下面的一个语句。
2024-07-20 19:44:22
404
原创 选择结构
表达式截断:如:k=i>-4 && ++j < -4,逻辑与左侧为假,就会判断此表达式为假,逻辑与右侧就不会去判断。就会出现表达式截断,此时如果输出++j的值,仍然是j原来的值。if语句可以嵌套,嵌套内容与外部是逻辑与的关系;就是还在第一个,第二个if语句表达的条件内。关系表达式有自己的数据类型:int型。在内存中所占的字节数为4。不能连续比较,由左到右的次序。是条件,:输出左右两边符合?条件的表达式或者关系。switch语句的表达式必须是整型或者与整型兼容。default:default是关键字。
2024-07-19 21:00:34
203
原创 顺序程序设计
putchar(c),输出字符变量c的值,c也可以是整型变量(输出结果为ASCII码对应的字符)。c语句组成:控制语句(if条件语句)、函数调用语句(printf)、表达式语句(表达式+分号)、空语句(;缓冲区,由于cpu与外设速度不匹配,对数据建立的临时的内存空间,等待数据收集完毕cpu再取出数据。“%m.nf”:m为输出占用的宽数,输出长度小于m,在前面补空格。1、printf函数:可以输出多个数据,且可以是任意类型。o:八进制无符号输出整数(不输出前导符o)d,i:带符号的十进制形式输出整数。
2024-07-18 20:19:45
229
原创 算数运算符和算术表达式、赋值运算符和赋值表达式。
printf(”%的“,’A'%‘3’):表示对A和3在ASCII码中对应的数字序号进行%操作。一个算术表达式中有低位和高位两种型,在计算的时候自动按此图优先级将低的转换成高的。(2)short = int,高位截断,只输出int4字节里面低位2个字节的部分。const int i = 2:此时可以对i进行取地址,i成为只读变量;(4)int = short,short是signed ,同上;对于"int i‘,此时i是有值的,理论来说是一个随机数。对于++i:i的值先加了,此时输出结果为加过之后的。
2024-07-17 19:46:02
167
原创 数据类型.
第一个1是符号位,之后八位是N+127的二进制表示,第10位开始就是小数点后的,补0到32位。int:4字节,正负整数0,32位的取值范围-2^31——2^31-1;unsigned int(无符号):取值范围0——2^32-1。c=(ASCII码字符编号)/c='(ASCII中字符)'long int : 8字节,-2^63——2^63-1。float:单精度,4字节;short int:2字节,-2^15——2^15-1。char 1字节,范围-2^7——2^7-1;负数原码:取绝对值,取反,+1。
2024-07-16 18:55:02
227
原创 Linux基本操作指令
(1)i进入操作模式编写,esc进入命令模式,然后:w保存,:wq退出,:q!(2)当前路径下cd打开,ls /home/linux/目标目录打开,ls 目标目录打开。(2)在操作模式下2yy,p复制;2、vi ,文件名+.c创建一个可编写程序,任何变量都有各自的内存空间。(3)vi,gcc编译,./a.out执行。(3)/根目录,..家目录,./当前。3、常量:在程序运行过程中不能改变的。(1)文件夹删除或移动需要加上-r。
2024-07-15 17:52:27
75
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人