- 博客(32)
- 收藏
- 关注
原创 Linux编程(IO多路复用)
④ select返回-1表示错误,返回0表示超时时间到没有监听到的事件发生,返回正数表示监听到的所有事件数(包括可读,可 写,异常),通常在处理事件时 会利用这个返回值来提高效率,避免不必要的事件触发检查。① readfds等是指针结果参数,会被函数修改,所以一般会另外定义一个allread_fdset,保持全部要监听读的句柄,将它的拷贝传递给select函数,返回可读的句柄集合,类型fdset支持赋值运算符=;epoll显著提高性能的前提是:监听大量描述符,并且每次触发事件的描述符文件非常少。
2024-07-29 22:42:12
496
原创 Linux编程(通信协议----TCP)
1、socket 套接字 ==》BSD socket ==》用于网络通信的一组接口函数。localaddr.sin_addr.s_addr= inet_addr("192.168.1.100") ///本机ip。recv(,0) /send(,0) ///TCP 常用套接字读写。recvfrom()/sendto() ///UDP 常用套接字读写。struct sockaddr ////通用地址结构。在socket()===>bind()===>connect();
2024-07-29 20:35:34
797
原创 Linux编程(通信协议---udp)
每个UDP数据包都是独立的,不需要前一个数据包的确认。10. **数据报长度**:UDP数据报的长度可以是任意的,但最大长度受限于IP数据报的最大长度,通常是65507字节。服务器端 server:socket() ===>bind()===>recvfrom()===>close()客户端 client:socket() ===>bind()===>sendto() ===>close()2. **简单性**:UDP的协议结构相对简单,只有8字节的UDP头部,包括源端口、目的端口、长度和校验和。
2024-07-16 20:21:36
651
原创 Linux编程(进程间通信--共享内存)
shmaddr 本地可用的地址,如果不确定则用NULL,表示。key ==》申请对象 ==》映射对象==》读写对象。功能:修改共享内存属性,也可以删除指定的共享内存对象。shmflg 申请的共享内存访问权限,八进制表示。返回值:成功 返回共享内存id,一般用shmid表示。功能:将指定shmid对应的共享内存映射到本地内存。返回值:成功 返回映射的地址,一般等于shmaddr。共享内存 ===》效率最高的进程间通信方式。参数:shmaddr 要断开的映射地址。参数:shmid 要删除的共享内存对象。
2024-07-12 22:10:31
286
原创 linux编程(进程间通信)
sig 当前程序要发送的信号编号 《=== kill -l。===》xx是 void fun(int) 类型函数的函数指针。===>fun 有三个宏表示:SIG_DFL 表示默认处理。无名管道 ===》pipe ==》只能给有亲缘关系进程通信。有名管道 ===》fifo ==》可以给任意单机进程通信。使用框架:创建管道 ==》读写管道 ==》关闭管道。
2024-07-11 21:24:01
1935
原创 Linux编程(线程控制)
功能:设置线程为分离的属性,线程自己在消亡的时候,释放相关的资源。定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁。如果sem没有资源(==0),则线程阻塞等待,一 旦有资源。互斥机制 ===》互斥锁 ===》保证临界资源的访问控制。信号量的定义 ===》信号量的初始化 ==》信号量的PV操作。如果sem有资源(==1),则申请该资源,程序继续运行。P ===》申请资源===》申请一个二值信号量。V ===》释放资源===》释放一个二值信号量。V操作对应函数 ==》sem_post();
2024-07-10 20:41:38
456
原创 Linux编程(线程)
retval 要回收的子线程返回值/状态。传整数 ===》int add(int a,int b);阻塞等待功能,如果指定的线程没有结束,则回收线程。线程的回收机制 ====》不同与进程没有孤儿线程和僵尸线程。arg 回调函数的参数,即参数3的指针函数参数。线程id是线程的唯一标识,是CPU维护的一组数字。概念:线程是轻量级进程,一般是一个进程中的多个任务。1: 自行退出 ==》自杀 ==》子线程自己退出。====》主线程结束任意生成的子线程都会结束。====》子线程的结束不会影响主线程的运行。
2024-07-09 21:23:32
708
原创 Linux编程(进程)
退出状态,终止的进程会通知父进程,自己使如何终止的。任何情况下,负进程都能使用wait,waitpid获得这个状态,以及资源的回收。僵尸进程:僵尸进程是指已经完成执行但尚未被其父进程回收的进程。这种状态下,进程占用的资源已经释放,但是在进程表中仍保留一个进程描述符。2)exit(), c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。孤儿进程:孤儿进程是指其父进程在子进程终止之前已经退出的进程。换句话说,孤儿进程没有父进程。linux中的状态,运行态,睡眠态,僵尸,暂停态。
2024-07-03 22:00:12
661
原创 linux应用编程(文件操作---目录文件)
目录文件 ----> 目录流指针 ----> 提供给相关函数操作。目录文件 -----> 流 (目录流指针)
2024-07-03 20:54:17
100
原创 Linux应用编程(文件IO----系统调用)
c.设备文件 ---- 文件IO ///dev/video0 ----> fopen();2 操作对象不在是流(FILE *),而是文件描述符(整数)文件描述符 --- 系统调用这组函数中,对打开文件的 标识。很小的非负的整数 int 0-1023。内核每打开一个文件就会获得一个文件 描述符。b.读写 --- read / write。一个基于Linux内核的没有缓存的IO机制。a.使用起来,简单 ,功能简单。a.打开 --- open。c.关闭 --- close。
2024-07-03 20:39:07
371
原创 linux应用编程 (高级编程)
c -- character -- 字符设备文件 --- 鼠标 ---- ls -l /dev/input/p -- pipe -- 管道文件 --- 实现操作系统中 进程间的一些 信息交换(通信)b -- block -- 块设备文件 --- 硬盘 ---- ls -l /dev/sda。l -- link -- 软连接文件 --- 类似windows的快捷方式。s -- socket -- 套接字文件 --- 网络的时候 (进程间的通信)
2024-07-01 22:33:24
1726
原创 shell编程
b 块设备文件 block test -b /dev/usb0 --- 硬盘。-p 管道文件 pipe (管道) //进程的通信。/bin/bash //编辑文件。4. ./XX.sh //执行文件。//条件的生成 -- test的命令 //注意: test 执行结果为真 0。先编译再执行 //gcc 编译 (.c ---> 机器代码)
2024-07-01 21:56:05
1315
原创 枚举 位运算
/此时 表示 给 int型 起了一个别名 叫 a。& 按位与运算 ---- 清零运算。| 按位或运算 ---- 置位(1)运算。要移动的数据,本身是有符号类型 ,如果右移,最高位 补 符号位。要移动的数据,本身是无符号类型 ,如果右移,最高位 补 0。4.枚举常量,可以给初值,给了初值之后,后面的值会被依次影响到。typedef 不能定义出一个新的类型 ,它是给已有类型起别名。a << 2 //表示对a 左移 2位。
2024-06-11 20:03:33
194
原创 结构体的应用
/保存地址-- 指向下一个节点。1.共用体初始化时,只能给一个值,这个值默认时给到第一个成员的。数据结构 ---- 指的是 数据的组织形式 //链表 树 图。//数据域 --存储要处理的数据。//空链表 --- 只有头节点,但是没有有效的数据节点。赋值的时候,每个成员只能影响,自己对应的字节。统计链表的长度 //有效节点的个数。不足,插入数据 删除数据 不方便。链表的目的 --- 存放数据。链式数据结构 -- 链表。数组 --- 数据结构。
2024-06-04 20:47:58
145
原创 结构体学习
声明类型的同时,定义变量,但是结构体名,可以省略。1.成员变量 一般是不同类型 //表示不同的含义。//如果没有超过4字节的,则按成员变量中最大对齐。//初始化 ,需要按照 成员列表的顺序,依次初始化。//如果没有超过4字节的,则按成员变量中最大对齐。s.name //表示访问s变量中的 name。3.如果 成员变量中有比4字节大。//如果超过4字节的,按照最大的成员对齐。//构造一个结构体类型 --- 声明结构体。//成员与成员之间的初始化的值,用逗号隔开。. 结构体成员运算符 //表示 从属关系。
2024-06-03 21:41:26
394
原创 C语言指针(2)
a<=>&a[0] a[0] //数据类型 int[4]char *s[ ] = {"hello","world","china"};//s1的空间开在栈上,但是s1指向的"字符串常量"//基类型 int[4]这种类型 ---数组类型。//存放"字符串常量区"//常量区的数据不能修改。//a数组名 -- &a[0]&a[0] //int[4] * 指针类型。
2024-05-30 21:07:28
378
原创 C语言指针
/因为左右两边类型不一致,p是int * //int * 表示 是一个 存放int类型数据的 空间的地址。//a 是一个float类型的变量, &a 表示获得了这块空间的地址,这个值的类型是float *//表示的p中存放的 地址编号 所代表的那块空间 中要存放的数据的类型。(1) 基类型 --- 表示 地址编号 所代表的那块空间 中要存放的数据的类型。//p指向的数据类型是int类型 //p指向的类型 基类型 (目标类型)//p变量,可以存放的是 int类型的地址。
2024-05-27 21:16:51
825
原创 嵌入式学习笔记(day14)
/a被放到全局区(静态区) --- 特点,从程序一开始变量就存在了,到程序结束时变量销毁。(1) (2) //第(1)N不会被替换,第(2)个会被替换。//声明了一个外部变量a --- 表示该变量的定义不在本文件中,而在别的文件中。//将a的作用域限定到本文件中,别的文件中不能使用extern 来引用。//extern 声明的这个变量,必须是一个全局变量。#include "文件名" //作用,将文件中的内容,包含到最终的.c文件中。//自动变量 ---空间开在 栈 上 --- 特点。
2024-05-27 20:51:31
301
原创 嵌入式学习笔记(day13)
全局区(静态区) //这块空间,代码编译好之后,就存在。但是,它不需要传数组长度 (原因,是因为一维字符型数组中,主要处理的是字符串数据,形参 (数组形式,行数) 实参(数组名,行数)一维整型数组 形参 (数组形式,长度) 实参(数组名,数组长度)1. 写一个二维数组的形式 (行数可以省略,列数不能省略)1. 写一个二维数组的形式 (行数可以省略,列数不能省略)存储的空间发生变化 ---放在了静态区(全局区)//时间角度 --- 关键字 ---生命周期。
2024-05-24 21:29:51
620
1
原创 嵌入式学习笔记(day12)
因为传的是数组名,而数组名是数组首元素的地址,所以相当于将数组空间的地址传给了被调函数,而被调函数,通过数组下标运算,可以直接访问到了主调函数中对应数组空间的数据。所以,数组传参的这种方式,可以实现,被调函数修改主调函数中的数据。问题n的解决,需要问题n-1的解决,往前推,直到,有一个明确的结果。形式上,保持一致,被调函数中 就可以 访问到主调函数中数组的数据。形参 写成数组的形式 同时需要 一个接受数组长度的形参。1. 将n-1格盘子, 从 A 起始柱 移动 B 辅助柱子。从本质上来说,其实就是循环。
2024-05-23 21:17:50
167
1
原创 嵌入式学习笔记(day11)
6.如果函数没有返回值,此时返回值类型说明符 可以写成 void //空 -没有。2.返回的结果,与返回值类型说明符,之间类型不一致时,以返回值类型说明符的类型为准。返回值的类型标识符 //用来说明 该函数(function)带出来数据的类型。//step2: 考虑 这个函数,需要用到哪些数据 --- 形式参数。返回值的类型标识符 函数名(形式参数) //函数头 ---head。return 语句 //表示,从函数中返回(就是函数结果)//step4:要带出怎么结果 --- 函数返回值的设计。
2024-05-22 21:16:12
373
1
原创 嵌入式学习笔记(day10)
/一维整型数组 ---表示定义了一个 有3个int型元素的 一维整型数组。//数组名所代表的类型 --- 去掉名字后剩下就是对应的类型。//数组名所代表的值 --- 首元素的地址。//dest是一个字符数组的数组名。//src是一个字符数组数组名。//a[i][j] = 表达式;
2024-05-16 21:44:04
318
原创 嵌入式学习笔记(day9)
"hello" //字符串 --- 一串字符。char *gets(char s[]) //传一个字符数组的数组名。//这个数组是用来放,char类型的数据的。存储上 "hello" -->本质上是按照字符数组的特点存储。1.找一个中间位置 mid (实际是数组中间位置的下标 )//这个函数可以解决(后面学)//初始化它 //全部初始化,部分初始化,未初始化。将一个数,插入到一个(有序的序列中)s //可以是数组名 也可以是 一个字符串常量。2.字符数组,主要是 存储 "字符串" 数据的。
2024-05-15 20:43:25
817
原创 嵌入式学习笔记(day8)
2.数组名代表的值-表示的是数组首元素的地址 也是整个数组的起始地址。//这些值依次给到前面的元素,后边未初始化的元素,默认是0。sizeof(a) //a代表的是 整个数组类型。//a去掉之后,剩下int[10] 这个称为数组类型。(3).[常量表达式]--- [] //定义时,表示此时定义的是一个数组。(1) 类型说明符 --- 说明这个数组中放的是哪一种类型的数据。
2024-05-14 21:40:20
374
2
原创 嵌入式学习笔记(day7)
do-while --先执行 后判断 //循环体始终都会被执行到,最少是一次。语法 while后面,不要加分号 //除非就是要写一个空语句。使循环趋于结束的语句)含义: 表示跳出 本层循环 (结束了本层循环)for( 表达式 1;goto //可以构造循环 ,本身并不是循环语句。直到,表达式判断为假,while结束(循环结束)do-while中,while后面 有分号。含义: 结束本次循环,继续下一次循环。语句执行完成后,继续 表达式 判断。假,do-while结束,s1 首先,求解表达式1,
2024-05-13 21:52:31
204
原创 嵌入式学习笔记(day6)
2.switch 中的 表达式 必须是一个整型表达式 或者是与整型兼容的类型的表达式。根据 表达式的结果,去匹配 case后面的 常量表达式的结果,否则,继续 判断 表达式2,如果表达式2为真 ,则,执行 语句2。否则,继续 判断 表达式3,如果表达式3为真 ,则,执行 语句3。else 总是和离它最近的前面的尚未使用的if配对。则,表示if语句结束,程序继续往下执行if后面的语句。运算过程: //实际上是if-else语句的简写。如果 表达式1 判读为真,则,执行 语句1。
2024-05-11 20:41:33
402
1
原创 嵌入式学习笔记(day5)
/此时a被当做地址用了,这不是一个有效的地址---访问到了 不能访问的空间(非法内存)//如果输入的数据,已经匹配了3个字符宽度,则表示scanf结束。%lf --- 表示将输入的 浮点形式的数据,转换为double类型。// %Lf // 表述输出 long double 注意 L 要大写。2. 输入的数据,都是先到了输入缓冲区的,scanf去其中进行数据匹配。%*c // 可以 匹配一个 数据项 ,匹配走之后,并不给到任何变量中。1. m //宽度 -- 在输入时,表示指定了输入数据的宽度。
2024-05-10 19:58:58
430
原创 嵌入式学习笔记(day4)
/这里的a本身是左值,但是不能做++a,a++,原因是const修饰后,a成了只读变量)//... 表示可变参数 --参数的数量可以变。占位符(%d) //将来要被 后面的参数值 替换掉 --格式转换 普通字符 //原样输出。lvalue (locationable value) //可定位的 ---可以获取到它的地址。//形参 --形式参数 ---本身是一个变量。// 能放在 = 左边的值,叫做左值 --- 变量。&a //& 表示取地址 ---获取a对应的内存单元的编号(地址)
2024-05-09 19:47:01
291
原创 嵌入式学习笔记(day3)
1|000 0000 0000 0000 //原码值 -0 //这个值比较特殊 -专门规定了一下,只有这一个值,符号位也是数值位 //-32768。0000 0000 |0000 0000|0000 0000 |0000 0000 // 0 最小值。符号位(1bits)|指数位(阶码位)(8bits)|尾数位 (23bits)符号位(1bits)|指数位(阶码位)(11bits)|尾数位 (52bits)'a' 0101010 //代表 'a'
2024-05-08 20:03:27
293
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人