自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 SQLite数据库

Oracle数据库是一个企业级的数据库系统,它提供了OCI(Oracle Call Interface),这是一个C语言的API,用于访问Oracle数据库。- ODBC是一个标准的数据库访问接口,它允许应用程序以一种独立于数据库的方式访问数据库。它提供了一个C语言的API,libpq,用于数据库连接和操作。- SQLite是一个轻量级的数据库,它是一个C库,提供了一个无服务器的自包含的SQL数据库引擎。- MariaDB是MySQL的一个分支,提供了类似的功能和API。它也提供了C语言的接口。

2024-08-29 22:10:57 160

原创 select epoll搭建并发式服务器

是一个系统调用,它允许服务器同时监视多个文件描述符(如套接字),以便知道哪个文件描述符准备好了进行读取或写入操作。返回时,它会提供一组准备好的文件描述符。如果是,接受连接,并创建一个新的套接字来与客户端通信。函数将感兴趣的文件描述符(如套接字)添加到epoll实例中,并指定要监视的事件类型。在处理大量并发连接时更加高效,因为它使用内核空间的数据结构来减少系统调用的开销。:首先,你需要创建一个或多个套接字,并将其绑定到服务器的地址和端口上。的一个关键优势是它可以处理大量并发连接,但要注意的是,

2024-08-28 21:06:53 235

原创 并发式服务器

并发式服务器是一种设计用来同时处理多个客户端请求的服务器。这种服务器能够提高资源利用率和响应速度,适用于需要服务大量用户的网络应用。:并发式服务器可以使用不同的 I/O 模型,包括阻塞 I/O、非阻塞 I/O、信号驱动 I/O 和异步 I/O。:并发式服务器可能需要共享资源,如内存、文件描述符等,因此需要适当的同步机制来避免冲突。:并发可以通过多线程或多进程实现。多线程共享同一内存空间,而多进程则拥有独立的内存空间。:并发式服务器能够同时处理多个任务或请求,而不是按顺序逐个处理。

2024-08-27 20:40:08 169

原创 粘包和抓包工具

在网络传输中,"粘包"(TCP粘包)是指使用TCP协议进行数据传输时,发送方发送的多个数据包被接收方一次性接收或者接收方一次读取操作获取到了发送方多次发送的数据。这种情况通常发生在使用TCP协议的socket编程中。TCP是一个面向流的协议,它不保留数据包的边界信息。TCP保证数据的顺序和可靠传输,但并不保证数据包的边界。:约定每个消息的长度,并在每个消息的开始处发送长度信息。:在每个消息的末尾添加一个特殊字符或字符串,作为消息结束的标志。

2024-08-23 22:27:01 583

原创 计算机间的通信

UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。accept //接听 ---这一步完成之后 连接就建立好了,之后就可以收发数据。TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数。2. 可靠传输 //保证数据准确可靠 (tcp协议机制 里面的功能 )在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。2. 在接收到数据,给出应答较困难的网络中使用UDP。据无误、数据无丢失、数据无失序、数据无重复到达的通信)

2024-08-22 19:51:44 225

原创 学习嵌入式第二十九天

IPv6是较新的版本,由128位二进制数组成,以冒号分隔的十六进制表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。IP地址(Internet Protocol Address)是互联网协议地址,它是分配给网络中每个设备的唯一标识符,用于在互联网上进行通信。:最后,当所有进程都不再需要共享内存时,创建共享内存的进程或拥有足够权限的进程可以删除共享内存段,释放资源。:也称为公网地址,是分配给互联网上可访问的设备的IP地址,它们是唯一的,可以在全球范围内被识别。

2024-08-21 20:56:31 784

原创 学习嵌入式第二十八天

在C语言中,有名管道(Named Pipe)是一种特殊的文件类型,它允许进程间通信。有名管道与匿名管道(Anonymous Pipe)不同,它在文件系统中有一个路径名,因此可以被多个进程访问。有名管道是阻塞的,如果管道已满,写操作会阻塞,直到有进程读取数据;如果管道为空,读操作会阻塞,直到有进程写入数据。这个函数需要一个路径名作为参数,这个路径名就是有名管道的文件名。函数打开有名管道,可以是读模式(O_RDONLY)或写模式(O_WRONLY)。:一旦有名管道被打开,就可以使用标准的读写函数如。

2024-08-18 18:22:13 216

原创 学习嵌入式第二十七天

3. 信号量的PV操作 (核心) sem_wait()/ sem_post() ---生产者 消费者 模型。//1 表示我有一个写资源可用。信号量集() //信号量 (6)@pipefd //用来获取 管道的两端 //读端pipefd[0]1. 信号量的定义 sem_t sem //造了一类资源。如果sem没有资源(==0),则线程阻塞等待,一旦有资源。如果sem有资源(==1),则申请该资源,程序继续运行。

2024-08-16 19:16:41 808

原创 学习嵌入式第二十六天

1.pthread_join //需要自己回收 ---线程的属性 (可结合性) --- 一般是子线程 在较短时间内运行完。可结合性 --- pthread_join //这种用于 ,线程任务较短,主线程需要关心子线程状态。可分离性 --- pthread_detach //子程序执行任务较长,主线程也不需要关心子线程状态。2.pthread_detach //可分离属性 ---子线程运行很久才结束 --- 设置分离属性。3.pthread_cancel //线程可以被取消。

2024-08-15 19:43:55 301

原创 学习嵌入式第二十五天

进程是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的实例。每个进程都有自己的独立内存空间,至少一个线程(主线程),以及可能的其他资源如打开的文件、子进程等。:线程是进程中的一个实体,是CPU调度和执行的单位,是程序执行的最小单位。线程共享所属进程的资源,如内存空间和文件句柄,但拥有自己的栈和程序计数器。线程共享进程的内存空间,这使得线程间的通信更加高效,但也需要同步机制来避免数据冲突。进程拥有独立的内存空间,一个进程的内存空间与其他进程是隔离的。线程是轻量级进程,一般是一个进程中的多个任务。

2024-08-14 19:22:29 1097

原创 学习嵌入式第二十四天

3)以e结尾的函数,可以传入一个指向环境字符串的指针数组的指针。3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。execv,execvp,execve,需要构造一个参数指针数组,然后将数组的地址传入。任何情况下,父进程都能使用wait,waitpid获得这个状态,以及资源的回收。exit -> 刷新缓存区 -> atexit注册的退出函数 -> _exit。c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。退出状态,终止的进程会通知父进程,自己使如何终止的。

2024-08-13 19:44:10 260

原创 学习嵌入式第二十三天

定义:状态:内存:执行:并发性:生命周期: 简单进程命令 ps aux pstree kill killall top 父子进程在宏观上并行在微观上串行

2024-08-12 20:21:18 141

原创 学习嵌入式第二十二天

检查权限:使用权限宏来检查文件所有者、组用户和其他用户的读、写、执行权限。组合使用宏:通常,文件类型和权限位是组合使用的,以确定文件的完整状态。返回值:成功返回保存日历时间结构体的指针,失败返回NULL。返回值:成功返回获得时间字符串的首地址,失败返回NULL。返回值:成功返回1970年到现在的秒数,失败返回-1。表示的是常规文件,则返回非零值。表示的是字符设备,则返回非零值。表示的是命名管道,则返回非零值。表示的是符号链接,则返回非零值。功能:获得1970年到现在的秒数。表示的是块设备,则返回非零值。

2024-08-08 18:47:21 299

原创 学习嵌入式第二十一天

功能:从目录流中读取文件信息并将保存信息的结构体地址返回。返回值:成功返回目录流指针,失败返回NULL。参数:opendir的返回结果中目录流对象。返回值:成功返回包含路径空间的字符串首地址。参数:buf:保存工作路径空间的首地址。功能:打开一个目录获得一个目录流指针。功能:关闭之前已经打开的目录流对象。pathname:目录文件的名字。返回值:包含文件信息的结构体。功能:改变当前程序的工作路径。参数:path:改变到的路径。参数:dirp:目录流指针。参数:name:目录名。path: 文件的路径。

2024-08-07 20:11:24 340

原创 学习嵌入式第二十天

是一个基于Linux内核的没有缓存的IO机制。O_EXCL,需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败。O_ASYNC异步io,什么时候io不确定,buf:要写入文件的字符串的首地址。通过文件描述符向文件中写一串数据。通过文件描述符读取文件中的数据。O_CREAT, 创建文件。count:要写入字符的个数。buf:存放数据空间的首地址。count:要读到数据的个数。O_TRUNC文件内容清空。成功返回实际写入的个数。成功返回读到数据的个数。O_APPEND追加。

2024-08-06 19:21:08 350

原创 学习嵌入式第十九天

读:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);功能:从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr。1,标准io的概念 1975 Dennis r IO库,C语言的标准,ANSI c。功能:从stream流对象关联的文件中获取size大小字节的文本数据。返回值:成功 返回指向有效数据的首地址,一般等于s的地址。fgetc/fputc,,,,,,一个字符,

2024-08-05 20:18:21 371

原创 学习嵌入式第十八天

Linux Shell 脚本是一种脚本语言,用于在 Linux 或类 Unix 操作系统上自动化命令的执行。Shell 脚本通常使用 Bash(Bourne Again Shell)编写,但也可以使用其他 Shell,如 sh、csh、ksh 等。今天开始学习Linux系统编程,这部分主要分位五个板块,今天主要学习了shell脚本配置相关的内容,脚本文件:Shell 脚本是一个文本文件,包含了一系列的命令和脚本语言特有的语法。脚本的执行:要执行一个脚本,可以在命令行中使用。开发效率高 cp 1 2。

2024-08-03 21:31:37 277

原创 学习嵌入式的十七天

例子:`~5` 的二进制表示是 `101`(5),反转后为 `010`,但由于C语言中整数是带符号的,所以实际结果是 `-6`(因为5的补码是101,取反后是010,加上符号位为1,即-6)。例子:`5 | 3` 的二进制表示是 `101`(5)和 `011`(3),结果为 `111`,即7。例子:`5 & 3` 的二进制表示是 `101`(5)和 `011`(3),结果为 `001`,即1。例子:`5 ^ 3` 的二进制表示是 `101`(5)和 `011`(3),结果为 `110`,即6。

2024-08-02 19:57:31 800

原创 学习嵌入式第十六天

前面只声明了一个结构体类型,它相当于一个模型,其中并无具体数据,系统也不对其分配内存单元。因此我们在使用结构体类型之前还要定义相应的变量。定义结构体类型变量的一般形式为:struct 类型名 变量名1,变量名 2;在定义了结构体变量之后,系统会为他们分配内存单元。注意结构体变量所占的内存并不是几个类型所占内存的和,而是系统遵循了叫做结构体对齐的规则来分配内存单元。结构体对齐是计算机编程中的一种内存布局优化技术。这种对齐可以使cup更快的进行读写操作,从而提高数据访问的效率。

2024-08-01 20:14:58 306

原创 学习嵌入式第十五天

由于[]比*优先级高,因此p先于[4]结合,形成p[4]的形式,这是一个数组形式,有4个元素,然后在于p结合,*表示此数组是指针类型 的,每个数组元素都可以指向一个整型变量。指向指针数据的指针变量就是我们所说的指向指针的指针,这个指针变量指向的数据是一个地址,而这个地址指向了另一个变量,这种情况就是指向指针变量的指针。一个数组,若其元素均为指针类型数据,称其为指针数组,也就是说,指针数组中的每一个元素就是一个指针变量。函数的指针一般用来降低程序的耦合性,也叫解耦,从而提高函数的复用性。

2024-07-31 20:37:55 265

原创 学习嵌入式第十四天

指针变量既可以指向变量也可以指向数组,所谓数组元素的指针就是数组元素的地址。c语言中想要访问一个字符串要用字符数组存放一个字符串,然后输出,现在可以不定义字符数组,而定义一个字符指针,用指针指向字符串中的字符。当const放在指针变量名和星号之间时,它表示这个指针本身的值是一个常量,即一旦指针被初始化后,就不能指向另一个不同的地址。当const同时放在指针变量名之前和星号之间时,它表示这个指针既不能修改它指向的值,也不能改变它指向的地址。类型的参数,表示要分配的字节数,并返回一个指向分配内存的指针。

2024-07-30 20:11:47 416

原创 学习嵌入式第十三天

以上是选择排序的代码,可以看到a数组的第 i 项被表示为了*(a + i),这是因为*a表示数组的第0项,而且指针变量加1,表示地址向后偏移sizeof(基类型),这里基类型是int,地址偏移了4位,而int型数组的每一项在内存中也是占4个字节,所以a[i]也可以表示成*(a + i)。指针的值:指针变量的值是它所指向的变量的内存地址,通过指针变量,可以直接访问和操作它所指向的变量的值。指针变量作为函数参数:函数的参数也可以是指针,它的作用是将一个变量的地址传送到另一个函数中。定义指针的一般形式为。

2024-07-29 18:15:04 173

原创 学习嵌入式第十二天

用一个指定的标识符来代表一个字符串,一般形式为:它的作用是在进行预处理时把PI都替换为3.14。

2024-07-27 22:08:19 250

原创 学习嵌入式第十一天

此时传递的参数是一维整型数组和数组的长度。因为主函数传递的参数是一维数组的首地址,并不是整个数组中的元素,所以在形参变量后面加一对方括号,来表示形参是一个数组。由于二维数组的行数在被调函数中无法计算,所以其行数要在主调函数中计算出来传递给被调函数。在C语言中,指针是一种特殊的变量,它存储了另一个变量的内存地址。指针传参是一种函数调用。传递的是数组元素的地址。时的参数传递方式,通过这种方式可以实现在被调函数中修改主调函数中的原始数据。可以用数组名作为函数参数,此时形参应当用数组名或用指针变量。

2024-07-26 19:33:42 110

原创 学习嵌入式第十天

栈区遵循先进后出的原则,主要由于存储局部变量和函数用的上下文信息,当一个函数被调用时,它的局部变量和参数会被自动分配到栈上,栈的大小通常有限;当一个函数被调用时,实际上传递的是参数的一个复制值,而不是参数本身。c语言的函数定义是互相平行的、独立的,也就是说,在定义函数时,一个函数内不能包含另一个函数。当一个函数被调用时,需要保存当前函数的执行状态,包括参数传递、返回地址、局部变量等,这个过程通过将这些状态入栈来实现。在函数调用结束时,通过出栈操作来恢复上述的这些状态,使函数可以继续执行的操作叫做恢复现场。

2024-07-25 19:12:46 177

原创 嵌入式学习第九天

一般形式为类型标识符 函数名()声明部分语句部分类型标识符 函数名 (形式参数列表)声明部分语句部分定义好的函数只有被调用。嵌套进主函数才能起作用。在最外层的函数叫主调函数,内层的函数叫被调函数。

2024-07-24 19:59:19 263

原创 学习嵌入式第八天

字符数组的定义方法与前面介绍的其他数组类似。例如:定义,赋值char a[10];c[0] = '1';char c[ ];初始化由此可以看出在初始化或赋值字符数组时花括号和逗号可以被双引号代替。

2024-07-23 19:01:57 898

原创 学习嵌入式第七天

数组有三大特性:单一性,有序性,连续性。int a[10];它表示定义了一个整型数组,数组名为a,此数组有10个元素。数组名的命名规则和变量名相同。定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。常量表达式中可以包括常量、符号常量和变量,例如:int a[len];注意,使用变量定义时不可以对数组进行初始化操作;常量必须是大于0的整型常量。

2024-07-22 20:33:12 125

原创 学习嵌入式第六天

(5)循环结束,执行for之后的语句。while语句和do···while语句的不同之处在于当判断条件都为假时,while语句不执行循环体语句直接结束循环,do···while语句会执行一次循环体语句再结束循环。do···while的执行顺序是:现执行一次循环体语句,然后判别表达式,当表达式的值为真时返回执行循环体语句,如此反复,直到表达式的值为假结束循环。表达式代表关系表达式或者逻辑表达式,当表达式的值为逻辑真时,执行花括号中的语句,执行结束后再次判断表达式的值,只有当表达式的值为逻辑假时结束循环。

2024-07-21 00:14:45 390

原创 学习嵌入式第五天

1、关系运算符是逻辑运算中比较简单的一种,c语言提供了六种关系运算符:=(大于等于)这四种优先级相同,==(判断是否相同)!如果b大于1,那么a的值是1,这个1代表逻辑真;如果b小于1,那么a的值是0,这个0代表逻辑假,此外在逻辑运算中非0的数值都代表逻辑真,只有0代表逻辑假。用逻辑运算符将关系表达式或 逻辑量连接起来的式子就是逻辑表达式,而且逻辑表达式的值是一个逻辑量(真或假)。(1)&&(逻辑与)只有运算符两边的操作数都为真时,表达式才为真。

2024-07-19 20:22:00 241

原创 学习嵌入式第四天

f 以小数形式输出实数,一般保留六位小数,也可以用%m.nf来设置输出的小数部分位数,m代表输出的数据共占m列,其中有n位小数,如果数值长度小于m,则在右端补空格,数值长度大于m,则会以数值原本的长度输出,所以m有时可以省略。%o 以八进制整形输出, %x (%X) 以十六进制整形输出,小写x代表如果要输出字母,字母为小写字母,大写X代表如果要输出字母,字母为大写。%d %i 以十进制整形数据输出,%md m为指定的输出数据位数, %ld 输出长整型数据,

2024-07-18 21:09:03 148

原创 学习嵌入式第三天

特别注意求余运算,求余运算符是%,求余运算表达式写做a%b,求余表达式结果的符号与左操作数相同,a与b的数据类型要求是与int兼容的类型。还有自增、自减运算符 ++i,--i,在使用i之前先使i的值加1(减1),i++,i--,在使用i之后使i的值加1(减1)。此外表达式也有数据类型,这就说明表达式也占内存空间,表达式所占的内存空间是特殊的只读类型,没有名称,且在使用完之后会立即回收。代表在定义了变量a的同时对a进行了初始化,初始化的值为1,而在定义了变量a之后,a = 1代表对a进行赋值,值为1。

2024-07-17 19:37:55 287

原创 c语言基础数据类型

转义字符:\n 换行 \t 水平制表 \b 退格\r 回车\\ 输入\ \' 输入' \" 输入" \ddd 1到3位八进制数所代表的字符 \xhh 1到2位十六进制数所代表的字符。整形变量,这种数据在内存中是以二进制的形式存放的,且是补码的形式。补码规定了正数的第一位是0,负数的第一位是1,正数的补码就是这个正数本身,负数的补码是这个负数的每一位取反然后再加一。基本整型的变量在内存中占4个字节,短整型的变量在内存中占2个字节,长整型的变量在内存中占8个字节。

2024-07-16 18:29:13 203

原创 Linux基础

在命令模式下输入i,o,O,以进入插入模式,在差入模式下按下esc,进入命令模式。6.mkdir (文件夹名):创建一个文件夹。vi文本编辑器分为两种模式:插入模式和命令模式。7.rmdir (文件夹名):删除一个文件夹。9.mv (源)(目标):移动文件到目标位置。10.cp(源)(目标):拷贝文件到目标位置。3.touch (文件名):创建一个文件。1.cd (目录名):切换目录。5.rm (文件名)-r:递归删除。4.rm (文件名):删除文件。2.ls:查看当前目录下的文件。

2024-07-15 19:06:55 174

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除