- 博客(189)
- 收藏
- 关注
原创 linux网络编程(五)epoll进阶
如果我们在第1步将rfd添加到epoll描述符的时候使用了EPOLLET标志,那么在第5步调用epoll_wait之后将有可能会挂起,因为剩余的数据还存在于文件的输入缓冲区内,而且数据发出端还在等待一个针对已经发出数据的反馈信息。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。但这并不是说每次read时都需要循环读,直到读到产生一个EAGAIN才认为此次事件处理完成,当read返回的读到的数据长度小于请求的数据长度时,就可以确定此时缓冲中已没有数据了,也就可以认为此事读事件已处理完成。
2022-11-16 11:39:23
426
原创 linux网络编程(四)多路I/O转接服务器
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。该类服务器实现的主旨思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。主要使用的方法有三种。
2022-11-16 00:34:32
586
原创 linux网络编程(三) TCP通信时序与多进程/线程并发服务器的编写
建立连接(三次握手)的过程:数据传输的过程:关闭连接(四次握手)的过程:滑动窗口4.多进程并发服务器编写5.多进程并发服务器编写在使用线程模型开发服务器时需考虑以下问题:1.调整进程内最大文件描述符上限2.线程如有共享数据,考虑线程同步3.服务于客户端线程退出时,退出处理。(退出值,分离态)4.系统负载,随着链接客户端增加,导致其它线程不能及时得到CPU4.TCP状态转换
2022-11-13 21:52:57
935
原创 linux网络编程(二)网络套接字编程
Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。套接字的内核实现较为复杂,不宜在学习初期深入学习。在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。
2022-11-07 21:59:12
659
原创 linux网络编程(一) TCP网络协议及其格式
从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。假设,A、B双方欲传输文件。规定:第一次,传输文件名,接收方接收到文件名,应答OK给传输方;第二次,发送文件的尺寸,接收方接收到该数据再次应答一个OK;第三次,传输文件内容。同样,接收方接收数据完成后应答OK表示文件内容接收成功。由此,无论A、B之间传递何种文件,都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵守的规则即为协议。
2022-11-03 10:19:55
996
原创 linux系统编程(六) linux文件系统的操作
文件系统是,一组规则,规定对文件的存储及读取的一般方法。其本质为结构体,存储文件的属性信息。目录项,其本质依然是结构体,重要成员变量有两个 {文件名,inode,…当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会被释放。工作目录:“./”代表当前目录,指的是进程当前的工作目录,默认是进程所执行的程序所在的目录位置。目录设置黏住位:若有w权限,创建不变,删除、修改只能由root、目录所有者、文件所有者操作。但是inode被删除以后,对应磁盘允许被替换,这样就会导致,文件真正可能被删除。
2022-09-11 19:23:28
1508
原创 linux系统编程(十一)线程同步(完结)
由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。当T1再次获得cpu继续 从失去cpu的位置向后写入1,当执行结束,内存中的100字节,既不是全1,也不是全0。如直接使用mutex,除了生产者、消费者之间要竞争互斥量以外,消费者之间也需要竞争互斥量,但如果汇聚(链表)中没有数据,消费者之间竞争互斥锁是无意义的。3.读写锁是“读模式加锁”时, 既有试图以写模式加锁的线程,也有试图以读模式加锁的线程。但,并没有强制限定。
2022-09-11 13:56:40
438
原创 linux系统编程(十)守护进程、线程
LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下)进程:独立地址空间,拥有PCB线程:有独立的PCB,但没有独立的地址空间(共享)区别:在于是否共享地址空间。独居(进程);合租(线程)。Linux下: 线程:最小的执行单位进程:最小分配资源单位,可看成是只有一个线程的进程。
2022-09-11 13:27:28
670
原创 linux系统编程(九) 信号
当注册了某个信号捕捉函数,捕捉到该信号以后,要调用该函数。A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。如:捕捉到信号后,在执行捕捉函数期间,不希望自动阻塞该信号,可将sa_flags设置为SA_NODEFER,除非sa_mask中包含该信号。不存在编号为0的信号。进程组:每个进程都属于一个进程组,进程组是一个或多个进程集合,他们相互关联,共同完成一个实体任务,每个进程组都有一个进程组长,默认进程组ID与进程组长ID相同。
2022-09-11 13:10:09
1381
原创 linux系统编程(八)进程间通信
任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。如果有指向管道读端的文件描述符没关闭(管道读端引用计数大于0),而持有管道读端的进程也没有从管道中读数据,这时有进程向管道写端写数据,那么在管道被写满时再次write会阻塞,直到管道中有空位置了才写入数据并返回。
2022-09-11 12:52:37
904
原创 linux系统编程(七)进程
一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。ls命令也是一个程序,执行它不需要提供完整的路径名/bin/ls,然而通常我们执行当前目录下的程序a.out却需要提供完整的路径名./a.out,这是因为PATH环境变量的值里面包含了ls命令所在的目录/bin,却不包含a.out所在的目录。其中保存该进程的退出状态。进程,是一个抽象的概念,与操作系统原理联系紧密。
2022-09-11 12:38:00
1011
原创 linux系统编程(五)针对linux系统中文件的IO操作
你和我的地址簿都有1、2、3、4页,但是每页里面的实际内容是不一样的,我的地址簿第1页写着3你的地址簿第1页写着4,对于你、我自己来说都是用第1页(虚拟),实际上用的分别是第3、4页(物理),不冲突。内核用的是3G以上的1G虚拟内存地址, 其中896M是直接映射到物理地址的,128M按需映射896M以上的所谓高位内存。其实我们讲的每个进程都有4G虚拟地址空间,讲的都是“可以寻址”4G,意思是虚拟地址的0-3G对于一个进程的用户态和内核态来说是可以访问的,而3-4G是只有进程的内核态可以访问的。
2022-09-07 09:35:47
662
原创 linux系统编程 (四) gdb调试与makefile
Makefile 就是一个脚本文件:脚本文件就是把一系列的命令放到一个文本里批量执行。命名:makefile或Makefile一个规则目标:依赖条件(一个tab)命令1.目标的时间必须晚于依赖条件的时间,否则,更新目录2.依赖条件如果不存在,找寻新的规则去产生依赖两个函数src=$(wildcard ./*.c):匹配当前目录下的所有.c文件。将文件名组成列表,赋值给变量src。
2022-09-01 19:32:36
810
原创 linux系统编程(三)gcc常用技巧与静态库与动态库制作
ldconfig就是实现这一功能的工具,其缺省读取/etc/ld.so.conf文件,对所有共享库按照一定规范建立符号连接,然后将信息写入/etc/ld.so.cache。从理论上讲,应用程序使用了静态库,要比使用动态加载库速度快1-5%,但实际上可能并非如此。共享库的创建比较简单,基本有两步。建议库开发人员创建共享库,比较明显的优势在于库是独立的,便于维护和更新;使用gcc的-l选项来指定静态库,使用-L参数来指定库文件的搜索路径。然后更新.a文件的索引,使之包含新加入的.o文件的内容(ar的参数s)。.
2022-08-31 20:43:04
513
原创 Linux系统编程 (二)linux下vim的常用命令
vi是“Visual interface”的简称,它在Linux上的地位就仿佛Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制。Vi不是一个排版程序,它不象Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。vi没有菜单,只有命令,且命令繁多。i有三种基本工作模式:+ 命令模式+ 文本输入模式+ 末行模式。...
2022-08-29 15:50:15
300
原创 linux系统编程(一)linux命令解析
察看当前系统下有哪些shell:察看当前系统正在使用的shell1.4 历史记录1.5 主键盘快捷键2. 目录和文件2.1 类Unix系统目录结构2.2.1 相对路径和绝对路径pwd 查看当前所在目录ll 竖排显示目录项和详细信息,ls -l的缩写显示dirname本身的详细信息递归查看目录递归展示详细信息2.7 mkdir2.9 touch删除文件:删除目录:重命名:移动文件:拷贝文件:拷贝
2022-08-28 17:44:11
687
原创 计算机网络第三章 数据链路层
数据链路层在物理层提供服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。为网络层提供服务。无确认无连接服务,有确认无连接服务,有确认面向连接服务(有连接一定有确认!)链路管理 即连接的建立、维持、释放(用于面向连接的服务)组帧流量控制差错控制(帧错/位错)...
2022-08-15 08:08:32
744
原创 第二章 物理层
该编码的特点是在每一个码元的中间出现电平跳变,位中间的跳变既做时钟信号(可用于同步),又做数据信号,但它所占的频带宽度是原始的基带宽度的两倍。码元是指用一个固定时长的信号波形(数字脉冲),代表不同离散数值的基本波形,是数字通信中数字信号的计量单位,这个时长内的信号称为k进制码元,而该时长称为码元宽度。模拟的声音数据是加载到模拟的载波信号中传输的。集线器的功能:对信号进行再生放大转发,对衰减的信号进行放大,接着转发到其他所有(除输入端口外),处于工作状态的端口上,以增加信号传输的距离,延长网络的长度。...
2022-08-10 19:39:53
247
原创 第一章 计算机网络概述
计算机网络是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。简而言之,计算机网络是互联的,自治的计算机集合。Ps:将这些计算设备连接起来,就形成了一个框架,但是需要软件才能使用。关键词:① 计算机网络是互联的、自治的计算机集合。② 互联:互联互通,通信链路。③ 自治:无主从关系。...............
2022-08-08 20:55:54
1494
原创 嵌入式linux基础:c++(一)类的引入
> Ps:这个`C++`系列是韦东山老师录制的视频基础,请大家支持韦老师。 这个专栏是:> 1.学习的笔记记录。> 2.整理和知识点汇总。> 3.个人做的项目经验汇总。
2022-06-21 21:52:57
280
原创 鸿蒙移植i.mx6ull(十二) 根文件系统
本章节做的修改会制作为补丁文件:假设目录中是未修改的代码,从没打过补丁;假设补丁文件放在openharmony的同级目录;对于STM32MP157,打补丁方法如下:对于IMX6ULL,打补丁方法如下:打上补丁后,可以如此编译(对于STM32MP157、IMX6ULL,编译命令是一样的):1.2 根文件系统的内容看看一个简单的程序:可以编译出一个APP:hello。有几个问题要考虑:解决这几个问题后,就可以知道根文件系统的内容了:在目录执行:可以知道:执行可以制作根文件系统。分析Makef
2022-06-08 11:35:52
945
原创 鸿蒙移植i.mx6ull(十一) 存储设备驱动程序(基于IMX6ULL)
参考资料:Linux中设备驱动程序分为3类:字符设备、块设备、网络设备。所谓字符设备就是LED、按键、LCD、触摸屏这些非存储设备,APP可以直接调用驱动函数去操作它们。而块设备就是Flash、磁盘这些存储设备,APP读写普通的文件时,最终会由驱动程序访问硬件。为什么叫块设备?以前的磁盘读写时,是以块为单位的:即使只是读写一个字节,也需要读写一个块。主要差别在于:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HNYW7Eon-1654658130765)(pic/09
2022-06-08 11:17:56
1043
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人