- 博客(30)
- 收藏
- 关注
原创 数据库sqlite3
文件 ----------------------->硬盘:程序运行结束,掉电数据不丢失。create table 表名(列名 数据类型,列名2 数据类型,列名3 数据类型);*降序排列:select * from 表名 order by 列名 DESC;条件查询:*select * from 表名 where 列 关系运算符 值*;数组、链表、变量 ----->内存:程序运行结束,掉电数据丢失。数据库:专业存储数据、大量数据 ----->硬盘。select 列名1,列名2,from 表名;
2024-08-29 21:02:53
654
原创 基于网络技术的天气数据查询
实时数据查询: 用于收集实时数据查询所需要的所有数据, 调用网络数据查询模块, 同时对网络数据查询模块的返回值进行整理, 使其按照规定的格式返回控制台进行显示,并且把查询结果暂存到缓存区用于后续的打印,查询时间区间为以输入有效的终止时间的时刻为准的操作系统时间为起始时间, 以输入的终止时间为结束时间。时间段数据查询: 用于收集时间段数据查询所需要的所有数据, 调用网络数据查询模块, 同时对网络数据查询模块的返回值进行整理, 使其按照规定的格式返回控制台进行显示, 并且把查询结果暂存到缓存区用于后续的打印。
2024-08-28 12:46:32
376
原创 tcp通信以及wireshark抓包
tcp在传输时,有可能就会将两次发送的内容粘到一起,这是由于tcp的第三个特点:字节流式传输。它不一定会将两次发送出来的数据进行严格区分。recv和send与read write相比较唯一不同的是多了一个flag,表示recv和send 专用于网络。但是socket在底层发送东西的时候是会在一段时间中等待的,若短时间内未收到接下来的信息,也就会直接发出去。Telnet 应用层协议(基于tcp的应用层协议)1.规定一些数据与数据之间的 间隔符。导致: 可能多次的数据粘到一起。2.可以指定要发送的数据的长度。
2024-08-23 19:42:30
195
原创 TCP、UDP
服务器端:socket --->bind ----> recvfrom //保存了客户端的地址 srcaddr----> sprintf ---->sendto // srcaddr。客户端:socket --- > //fgets(实现多次通信)----> sendto ----> recvfrom ---->printf。-----好 ---------------->-----好 ----------------><----我也要断开----------每一个应用程序进程有一个端口号,
2024-08-22 20:28:19
529
原创 IPC 进程间通信方式
b/s browser server 浏览器-服务器模型 ------ 通用客户端。c/s client server 客户端-服务器模型 ------ 专用客户端。//client ---------客户端 ----角色 ------主动的角色。//server --------服务器端 -----角色 ----被动的角色。可以将socket当做一个特殊的文件。//用来标识网络中的一台主机 ---- 通过ip可以找到对应的一台主机。//1.一种特殊的文件 -----专门用于网络通信(不同主机间的进程)
2024-08-21 21:23:30
736
原创 有名管道和信号
对于SIGCHLD信号,无论子进程是正常结束还是异常结束,都会发送这个信号到父进程。信号 被称为 软中断 (软件层面 对中断过程的一种模拟)1.有名管道 特殊文件,但是在系统中有一个名字。pathname :创建出的管道文件的文件名。3.有名管道 操作 符合 前面管道操作特点。handler:要对这个信号做怎样的处理。4.管道中数据 遵循fifo的读写规则。//2、如果,步调一致 ----同步。signum:要处理的信号的 编号。不能被阻塞,不能被忽略,不能被处理。如果,步调不一致 -----异步。
2024-08-17 20:43:03
313
原创 互斥锁以及进程间通信
Pshared:用来指定这个信号量是用在进程还是线程中的(0 :线程 不为0:进程)//2.不能重复买票,将100张车票均匀的从两个窗口卖出即可。pipefd //用来获取 管道的两端 //读端pipefd[0]可以读管道,但是管道中如果没有数据了,此时 读操作 不阻塞。可以读管道,但是管道中如果没有数据了,此时 读操作 阻塞。数组管道的两端就是读写,数组的0号指针是读端,数组的1号指针是写端。信号量集() //信号量 (6)
2024-08-16 20:11:24
743
原创 线程的退出
1.pthread_join //需要自己回收 -----线程的属性(可结合性) --一般是子线程 在短时间内运行完。带来了资源竞争 //专门的技术 解决资源竞争 ----互斥 同步。retval //退出状态值 //需要传的是,退出状态值的地址。2.//可分离属性 ----子线程运行很久才结束 ---设置分离属性。Pthread_mutex_unlock() //解锁。Pthread_mutex_lock() //加锁。pthread:要结束的线程的tid号。
2024-08-15 20:03:48
910
原创 进程的结束
此时不需要写入文件的路径,只需要填入要执行的可执行文件的文件名 //可执行文件必须在系统的/bin目录中。3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。2.父进程创建出子进程之后,子进程做的事情与父进程完全不同 //自力更生。用一个新的进程的镜像取代(各个段)当前进程的镜像(各个段),但不包括pcb。c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。多任务 : 淘宝服务器 程序 ------创建子程序。
2024-08-13 21:10:46
545
原创 进程与线程
1.进程网络编程进程(process):进行中的程序 ----正在运行中的程序进程 -- -程序的一次执行的过程进程 是程序的一个实例进程 vs 程序程序是在内存中运行的程序 --- 静态 --- 硬盘进程 --- 动态 --- 内存。
2024-08-12 20:36:48
690
原创 目录文件属性
如果使用了一个结构体要查找这个结构体的成员,不能直接使用man 指令,而是应该用man 指令查找使用这个结构体的函数名。DT_CHR:字符设备,键盘鼠标等,一个字符一个字符的读/写,字符与字符之间有顺序。在Linux中,以.开头的文件是隐藏文件,.代表本层 ..代表上层。文件名和文件内容是分开放的,文件名不在stat里,而是在目录中。info*:一项,目录中有很多项内容,info代表其中的一个。目录名区分大小写:重名的文件和目录不能在一个目录下同时存在。d_type:判断这个文件是七种中的哪一个。
2024-08-07 20:11:17
897
原创 文件IO及缓冲区
再用偏移量写+10的话,就会跳到字符串之后再偏10.这个时候需要写入一个字符,文件的长度才会变大,在偏移量与最后一个字符之间的这部分空白会自动补零。.2操作对象不在是流,而是文件描述符FILE* ,本质是一个数,数字代表一个即将被操作的资源: int 0-1023。返回值是写入的字节数,但是0也不一定是错的,该函数也可用在网络中,反0也可能只是因为当前网络比较拥塞。通过文件流指针来控制。文件描述符,要写入的内容,实际写入的长度(buf的有效长度)文件描述符,从那里读,最大可以读的长度(即Buf的长度)
2024-08-06 20:41:38
790
原创 文件I/O
因为fgets和fputs每一次复制都是一个字符串,是以0为结束标志的,但是图片在内存中以二进制存放,有极大可能会出现00这样的数,fgets会将此误判为截断标志,那么复制的字节数就会远小于原有文件的字节数,导致数据丢失,因此不可用来处理图像。系统提供的三个流指针(FILE*):当a.out开始运行的时候,系统就会自动调用这三个流指针。Char buf[]中,[]内的数据长度指的是要打开的文件一行的长度。一般情况下,这里是void*的时候,传的是二进制的。所以开的buf的空间应该尽可能比原有文件字节数长。
2024-08-05 20:33:11
438
原创 shell脚本
输出echo :“aaa,bbb,$a”:双引号会将$a,自动替换为值,‘aaa,bbb,$a’单引号原样输出。d:目录 L:软链接(快捷方式) p(pipe):管道文件,给不同进程之间共享数据。终端是一个正在运行的程序,pid就是一个程序编号,正在运行的程序编号。$#与argc相同就是计数,区别是$#在计数的时候不算命令本身。组用户(批量用户,一个班的其他同学);在脚本中,若test返回的结果为0,是真,非0为假。脚本中赋值,不需要给变量定义类型,读变量的时候要加$,写的时候不需要。
2024-08-03 18:49:54
413
原创 结构体及其应用
各个节点都是主程序在不同时间malloc申请来的,所以前一个节点和后一个节点的地址不连续,那么就不能用phead+1去查找下一个,只能一个一个挨个去捋一遍。结构体亦可以通过指针进行传参,通过指针传参只需要8个字节,而如果通过值传递需要原有结构体那么大的空间,指针传参效率更高。int是抽象的,i是具体的。,并且每个成员的首字节放置的位置必须能够整除成员的字节数;首节点的下一个节点称为头节点,是指针开始需要的节点。,合法的n的数值分别是1、2、4、8、16。部分初始化,剩下未初始化的部分是0,是。
2024-08-01 20:02:14
410
原创 数组指针,函数指针
回顾:字符串在字符串常量区,若两个指针中存的都是helloworld!,那么就没必要在内存中存两份,那么puts的输出结果为yesPrintf中不一定只能传“”,也可以传数组的首元素。
2024-07-31 20:21:50
224
原创 字符串指针及指向函数的指针
要包一个头文件<stdlib.h>malloc(申请的空间不在栈上,在堆上)将你申请的大小的内存空间的首字节的地址返回 malloc可以保证你所申请的内存空间一定是连续的。指针的主要作用就是实现在被调函数中修改主调函数,前提是在调用函数时要把要修改的参数的地址传给被调函数。用malloc有可能申请不到,若申请到内存,则返回申请到的内存的首地址,若申请不到,则返回一个空指针。//表示p不能改变,p指向的内容(*p)也不可以改变。//表示p不能改变,但是p指向的内容(*p)可以改变。
2024-07-30 20:25:59
882
原创 指针和地址
基类型 * 指针变量名;基类型:将来要定义的指针要装的地址是什么类型int *p:只用来装int型指针变量p指向变量i指的是:p中放的是的地址下面都是合法的定义:(pointer_3是指向float型变量的指针变量)(pointer4是指向字符型变量的指针变量)指针变量指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。下面的赋值是不合法的:/*pointer_1为指针变量,100为整数*/类比:整形是用来装整数的数据类型。
2024-07-29 18:51:34
368
原创 数组作为函数参数
(3)在被调用函数中声明了形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C语言编译对形参数组大小不做检查,只是将实参数组的首元素的地址传给形参数组。这里算不出来行数,就是因为a是首元素的地址,而地址是8个字节,然后a[0]是一行,这里一行有4个元素,且每个元素都是Int型的,所以是16个字节。由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素可以作为函数的实参,与用变量作实参一样,是单向传递,即。在传递时,传的a是数组首元素的地址,在64为架构下,长度为8个字节。
2024-07-26 19:48:07
506
原创 函数的调用
return语句后面可以跟表达式,只要return 后面的返回值和定义的返回值相同就行注意:ch是一个三行三列的字符型数组字符数组初始化的末尾有一个'\0',表示这一行的结束,因为BBB刚好等于字符数组的列数,末尾的'\0'无处存放,在打印ch[1]时的结果为BBBCCc语言中的逻辑结果其实是一个整形,(返回的int型其实是一个逻辑结果)且非零即为真函数在调用过程中,发现参数给错了的解决办法1、判断一下条件,不符合的返回一个-12、用assert函数,使用这个函数需要加头文件。
2024-07-25 20:05:22
553
原创 二维数组及函数
定义:从无到有声明:将函数名,函数参数的个数和参数类型等信息告知编译系统类型标识符函数名(形式参数表列)声明部分语句部分类型标识符:就是函数的返回值的类型函数名:标识符,符合标识符的命名规范返回值:运算结束后,得到的结果的数据类型,通过return语句获得设计函数时,每个形参表中的形参的类型必须 单独定义。
2024-07-24 20:24:13
850
原创 day8 字符数组
在C语言中,字符数组的定义方式大概是这样的:这里,char 表示字符类型,str 是数组的名字,[6] 表示这个数组可以存储6个字符(包括最后的空字符\0,它是字符串的结束标志)。"hello" 就是被存储在这个数组中的字符串。形如这样的数组就相当于一个容器:开辟出了一个占100个字节的数组空间,内容存放的是随机数注意:这个定义的字符串的长度要足够大,最短也要是len+1。
2024-07-23 19:32:04
637
原创 day7 一维数组
1、类型不匹配 2、a中有十个元素,没说把哪个赋值成100 3、a在程序中代表数组首元素的地址,在内存中是一个常量,不能赋值。3、对全部数组元素进行赋初值时,由于数据个数已知,可以不指定数组长度。例如:int 【0】={0,1,2,3,4,5,6,7,8,9}例如:int 【0】={0,1,2,3,4,5}例如:int 【】={0,1,2,3,4,5}常量表达式:>=1且只为整数,表示数组的大小。类型:任何已有类型,但不能是void型。1、在定义数组时对数组赋初值。2、只给一部分数组元素赋值。
2024-07-22 23:46:02
146
原创 day6 循环控制
2、用while 和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。continue语句只结束本次循环,而不是终止整个循环的执行。可以应用在switch-case语句中用于跳出switch结构,用于执行下一个语句,也可以用来从循环体内跳出循环,提前结束循环。for 语句可以用于循环次数已经确定的情况,也可以用于循环次数不确定而只给出循环结束条件的情况,完全可以代替while语句。其作用为结束本次循环,即跳过循环体下面未执行的语句,接着进行下一次是否执行循环的判定。
2024-07-20 17:48:10
432
原创 day5 选择结构程序设计
c语言在表达逻辑运算结果中,用数值“1”代表“真”,数值“0”代表“假”。在判断一个量是否为“真”是,以“0”代表“假”,以非0代表“真”。在if语句中,当被判别的表达式的值为“真“或”假“时,都执行一个赋值语句且向同一个变量赋值时,可以用一个条件运算符来处理。a : b”是一个条件表达式,执行的语句:如果a>b为真,则取a,否则取b。”是单目运算符,只要求有一个运算量。在逻辑运算中,&&中,若&&前面的表达式结果已经为假,那右边的表达式不进行运算。2,逻辑运算符中的“&&”和“||”低于关系运算符,“!
2024-07-20 14:48:16
1124
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人