Linux学习
文章平均质量分 95
本专栏我将和大家一起学习Linux。
momo小菜pa
momo
展开
-
Linux--IO模型_多路转接
1. 阻塞IO模型特点:在阻塞IO模型中,应用程序发起一个IO请求后会一直阻塞等待操作完成,直到数据准备好或者超时才返回结果。在等待IO完成期间,应用程序会处于阻塞状态,无法执行其他任务。典型应用:阻塞socket、Java BIO等。优点:实现难度低,开发应用较容易。缺点:不适用并发量大的应用,因为每个请求IO都会阻塞进程,需要为每个请求分配一个处理进程(线程),系统开销大。2. 非阻塞IO模型特点:应用程序发起一个IO请求后会立即返回,无需等待操作完成。原创 2024-08-30 17:51:10 · 1195 阅读 · 2 评论 -
Linux——IO模型_多路转接(epoll)
一旦网卡中有数据了,网卡同个中断交给OS,接着网络协议栈就拿到数据了,所以在输入和输出缓冲区里有没有数据,OS是很清楚的,OS在缓冲区中设置回调方法,该回调方法就是epoll_ctl构建的。底层一旦有数据就绪并且是用户关心的,此时OS就会调用回调方法构建就绪队列的结点,填充清楚,是哪一个fd的什么事件已经就绪了,并连入就绪队列。只能循环读取,知道读不到数据,循环读取肯定是会遇到阻塞问题的,epoll当然是不敢阻塞的,否则进程会被挂起,因此fd必须是非阻塞的。进行增加,删除,修改操作。原创 2024-08-30 17:50:29 · 1127 阅读 · 3 评论 -
Linux--NAT,代理服务,内网穿透
在公司内服务器部署了一个登录服务,端口22,此时我也在中转服务器上也部署了一个服务端口8888,只不过小李访问服务器的xxx:8888服务,服务器会直接寻找并启动公司内部的shh:22的登录服务。左侧在内网中唯一的,右侧则是在公网中唯一,那么左侧和右侧是互为键值的,服务器做应答的时候就可以反向查表,发送给内网中的主机。),因为服务器可以向对应的客户端发消息,此时又拿到了两个客户端的信息,那么服务器是否能作为中转站将两个客户端的IP和port,分别发给对方,那么两个客户端就都知道对方的IP和port了(原创 2024-08-24 22:52:07 · 848 阅读 · 0 评论 -
Linux--数据链路层(mac&&arp)
若此时A向E发送了消息,F向C发送了消息,那么交换机不会把交给E的消息给i1一侧了,交给F的消息也不会被转发给i0一侧了,这样就避免了两台主机的数据碰撞了,因为他们两个的数据在不同的区域内,在发送数据的时候,(src会带上自己的mac地址,dst是目的机的mac地址,data:发送的数据)会将发送的通过数据网络协议栈变成数据帧,然后通过局域网发送到局域网中,局域网的主机都能收到,主机会通过mac地址判断是不是自己的消息,如果是自己的消息,就会接收处理消息,最终以同样的方式发送回去。原创 2024-08-24 13:29:31 · 1230 阅读 · 0 评论 -
Linux--网络层 IP协议
经过精心的设计,合理的划分,可以高效支未来的报文路径查找,大大提高查找目标主机的效率:将网络划分为多个子网后,每个子网内部的通信不需要经过路由器(在广播域内),这样可以减少路由器上需要维护的路由表项数量。找不到偏移量为0的(没有前面部分),找不到更多分片==0的(没有后面部分),中间部分:将收到的片报文进行排序,因为第一分片的偏移量+自己的长度(除去报头:1500-20)=下一个分片的偏移量,如果没有对应的偏移量,那么就证明丢失了,而且丢失了哪一片也能知道。IP标识网络中主机的唯一性,指的是公网IP;原创 2024-08-22 23:19:41 · 1164 阅读 · 9 评论 -
Linux--传输层协议TCP
如果说有人把建立连接设置成一次握手,那么如果有一台机器给服务器发送大量的SYN报文(一个客户端给服务器发送大量的SYN,我们称为SYN洪水),对于客户端来说几乎没什么成本,此时服务器就被挂满了大量的连接,而且这些连接不会被使用,一次连接占一点资源,多次下来,导致服务器的资源越来越少,这就会导致资源的浪费。如果发送了1000个报文只接受了1个报文,丢了999个报文,因为TCP有滑动窗口的机制,他知道服务器能接收多少报文,所以不可能是服务器的问题,一定是网络出现了很大的问题。那么接收方ACK的确认序号怎么填?原创 2024-08-19 17:05:44 · 1129 阅读 · 0 评论 -
Linux--传输层协议UDP
负责数据能够从发送端传输接收端.原创 2024-08-15 16:12:03 · 1236 阅读 · 0 评论 -
Linux--应用层协议HTTP协议(http服务器构建)
GET方法也可以向服务器发送数据。在HTTP的URL中,端口号通常是不显示的,因为HTTP有一个默认的端口号80。服务器给我一个请求,我给他应答:首先进行服务列表构建,一个方法对应一个服务,如果客户端的请求存在参数,他就会调用外部方法,将参数传给外部方法处理,放回结果。所谓的URL域名就是服务器地址,就是唯一的一台主机,端口号对应唯一的服务进程,文件路径标明该主机上的唯一的文件资源。总的来说,这段代码实现了一个简单的HTTP服务器,它监听指定端口,并能够处理简单的登录请求,返回一个固定的HTML响应。原创 2024-08-14 23:48:01 · 1110 阅读 · 0 评论 -
Linux--应用层自定义协议与序列化(例子:网络计算器)
tcp服务器(Tcpserver)处理请求,会做IO,那么就调用IO服务(Service),IO服务处理做序列化和反序列化,还要处理业务,这时就会调用业务处理服务(NetCal网络计算器)。整体而言,这段代码展示了如何在C++中使用JSON进行简单的序列化和反序列化操作,以及如何设计一个简单的文本基通信协议来传输结构化数据。通信协议的设计是基于文本的,使用特定的格式来传输数据,包括长度字段和实际的JSON字符串。类,它负责处理客户端的连接请求,并对接收到的数据进行处理后再发送回客户端。原创 2024-08-12 12:16:26 · 1070 阅读 · 5 评论 -
Linux--Socket 编程 UDP(简单的回显服务器和客户端代码)
但如果你的服务器上有很多的ip地址,一个ip1,一个ip2,(如内网ip,回环ip)而我们上层的端口号为:8888。如果你的服务器bind ip1和8888,未来你的服务器收到各种报文都是发给8888的。有ip1的也有ip2的,但服务器只会接收ip1的报文,但如果服务器bind的ip为0,就意味着不管发送的ip是谁,只要是发给端口号为:8888的,服务器都会接收!(在做本地测试的时候,你也可以使用公网ip向你的服务器发消息,能不能成功,就看你的云服务器是怎么设定的了)函数等待并接收来自服务器的响应。原创 2024-07-26 17:11:03 · 1132 阅读 · 3 评论 -
Linux--Socket编程预备
程, 但是这样做, 会让系统进程管理和网络强耦合(pid每次启动的时候都会发送变化,那么两者之间有联系,意味着网络部分也要发送变化), 实际设计的时候, 并没有选择这。虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时, 使用的数据结。0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的。种 sockaddr 结构体的首地址,不需要知道具体是哪种类型的 sockaddr 结构体,就可。原创 2024-07-24 22:54:47 · 1074 阅读 · 0 评论 -
Linux--网络基础
TCP/IP 协议的本质是一种解决方案,为了解决上面的问题然而上面的问题性质不同,种类不同,导致协议的性质不同,种类不同,所以协议是要分层处理的。TCP/IP 协议能分层, 前提是因为问题们本身能分层。原创 2024-07-24 15:52:57 · 1251 阅读 · 0 评论 -
Linux--实现线程池(万字详解)
IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是 设计模式。原创 2024-07-19 18:14:23 · 931 阅读 · 1 评论 -
Linux--信号量
由于环形队列的下标也是属于临界资源的,如果不维持关系内部的互斥关系,是一定会破坏环形队列结构的。当一个线程(或进程)获取了信号量(将其值从1减为0),它便获得了对某个共享资源的独占访问权,其他试图获取该信号量的线程将被阻塞,直到信号量被释放(其值从0加回1)。sem_post函数用于信号量的V操作,主要作用是给信号量的值加上一个“1”,并可能唤醒一个或多个在该信号量上等待的线程。该函数用于信号量的P操作,从信号量的值中减去1,如果信号量的值变为0,则当前线程将被阻塞,直到信号量的值被其他线程通过。原创 2024-07-18 15:16:24 · 1176 阅读 · 0 评论 -
Linux--线程同步
当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)线程同步同样是需要互斥锁来实现的,但不同的是:线程同步,程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息或状态。同步的目的是确保线程之间。由于生产者和消费者之间的解耦和并行处理能力,生产者消费者模型可以很容易地扩展到处理更多的数据或更复杂的任务。1.这两个的顺序是没有关系,因为无论是消费过程,还是生产过程,都是要持有锁的,唤醒后是要重新申请锁的。原创 2024-07-17 10:35:15 · 825 阅读 · 3 评论 -
Linux--线程互斥(加锁)
(即它在编译时就已经分配了内存空间)原创 2024-07-15 23:10:21 · 992 阅读 · 2 评论 -
Linux--线程ID&&封装管理原生线程
我们生成的可执行程序在没运行的时候,当然也是在磁盘中的。当运行的时候,我们的可执行程序要加载到内存中,程序要变成一个进程的时候,它的PCB和内核数据结构要被创建出来,通过页表映射到可执行程序的代码和数据。库中创建一个线程,会为线程申请一个内存块(每创建一个线程申请一个内存块),所有的块都是连续存储的,内存块就是一个大号的结构体,内存块中存在线程在用户及最基本的属性和线程栈,这个栈是线程独立的栈结构。所以线程的概念,只是在库中表现出来的,所以我们把Linux中的线程称之为:用户级线程。原创 2024-07-10 15:46:39 · 935 阅读 · 0 评论 -
Linux--线程的控制
线程的创建,终止,等待,分离新线程如何终止?1. 线程函数 return3. main thread call pthread_cancel, 新线程退出结果是-1。原创 2024-07-09 17:15:19 · 1107 阅读 · 3 评论 -
Linux--线程(概念篇)
我们都知道系统和磁盘文件进行IO的基本单位是内存块4KB--8个扇区。我们以4GB大小的物理内存为例,物理内存被分为一个一个的页框,一个页框的大小也就是4KB,那么我们也就清楚了,磁盘加载到物理内存,操作系统会从磁盘中读取该页面并将其加载到物理内存中的一个页框/页帧中。在父子进程进行共享内存的全局变量int只占四个字节,我对他写入时要发生写时拷贝,写时拷贝的本质就让操作系统重新申请内存,那么拷贝的时候是拷贝四个字节还是4kb呢?对于全局变量int的写入操作,通常不会触发写时拷贝。原创 2024-07-08 22:41:28 · 1361 阅读 · 2 评论 -
Linux--信号(万字详解!超完整!)
我们都知道,在管道通信时,读端关闭,写端一直进行,写就没有意义了,这时候操作系统,就会向进程发送SIGPIPE(13号信号),终止进程。原创 2024-07-05 20:39:01 · 1148 阅读 · 4 评论 -
Linux--进程间通信(system V共享内存)
这意味着,我们给两个进程使用同样的pathname和同样的id,调用同样的ftok,就能形成同样的key了。当多个进程都映射了同一块共享内存到各自的地址空间后 ,进程A可以将数据写入共享内存,然后进程B可以从共享内存中读取这些数据,从而实现进程间的数据交换。因为即使其他进程知道了你的共享内存段的键,它们也无法直接访问或修改你的共享内存段,除非它们也通过。key:属于用户形成,内核使用的一个字段,用户不能使用key来进行shm的管理,是给内核用来区分shm唯一性的(用户给操作系统用的)来指示具体的错误原因。原创 2024-06-07 16:02:15 · 952 阅读 · 8 评论 -
Linux--进程间通信(2)(有名管道)
这使得任何进程都可以通过该名称来访问管道,而不必是创建管道的进程的子进程。有名管道支持不同进程间的通信,甚至支持跨计算机(网络)的通信。有名管道的生命周期由创建它的进程控制,但即使创建它的进程终止,只要还有进程连接着管道,管道就会继续存在。命名管道在操作系统中表现为一种特殊类型的文件,它存在于系统的命名空间中,可以像打开文件那样被打开和读写。一旦创建,命名管道就可以在不同的进程中被打开多次,允许单向或双向的数据流传输。提供一个namepipe的类,它封装了命名管道的创建、打开、读写和删除的逻辑。原创 2024-05-28 13:43:46 · 766 阅读 · 2 评论 -
Linux--构建进程池
如果我们是关一个等待一个,那么第一个信道,只会关闭一个读端,但还有其它的读端,这就会发生进程阻塞,导致管道文件一直在等待读取,无法被释放;如果统一的关闭读端,那么当关闭到最后一个信道的时候,最后一个信道读端只有一个,管道文件会被释放,然后就会递归式的逆向关闭其它信道的所有读端,最后将所有的管道文件释放,父进程只需要一 一等待,就能回收所有子进程了。下面函数的主要逻辑是创建多个管道和相应的子进程,每个子进程都将从它自己的管道中读取数据,而父进程则保留管道的写端以便后续向子进程发送数据。,然后关闭读端并退出。原创 2024-05-28 13:43:13 · 1099 阅读 · 2 评论 -
Linux--动静态库制作使用及使用
我们在执行这段代码的时候,调用了里面的函数,我们没有该函数的实现,但可以使用它,是因为我们链接了它们的库,有gcc编译器完成链接,ldd可以查看当前可执行程序链接了上面库。综上所述,动态库和静态库各有优缺点,适用于不同的场景和需求。静态库在编译期间,就把库中的方法拷贝到了程序当中,未来加载就只谈论程序加载,与库没有关系,所以我们再谈库的加载时,不考虑 静态库,只考虑动态库。既然系统找不到我们的库文件,那么我们直接将库文件拷贝到系统共享的库路径下,这样一来系统就能够找到对应的库文件了。选项表示创建一个库。原创 2024-05-19 14:14:00 · 736 阅读 · 8 评论 -
Linux--软硬链接
例如,如果目录A硬链接到目录B,而目录B又硬链接回目录A,那么在遍历目录结构时,系统可能会陷入无限循环,导致无法正确定位或访问目录。当我们说一个目录的引用计数为2时,这通常是因为每个目录在其父目录中都有一个条目(即一个硬链接),并且它自己还有一个指向自己的。删除一个文件名和inode的关系,引用计数就变为1,再将硬链接删除,引用计数变为0,此时文件才会被删除。那如果我们的可执行程序被放到了一个很深的路径下,我们就只能这样运行我们的可执行程序,这就十分的麻烦了。和建立软连接的区别就是,少了一个-s选项。原创 2024-05-18 13:53:05 · 1113 阅读 · 3 评论 -
Linux-- 重定向&&缓冲区
查自己的文件描述表,分配最小的没有被使用的fd),那么现在向fd1中写就是在向log.txt中写,所以我们查看到log.txt中的内容就是printf&&fprintf输出的内容,这就是对文件做重定向。,因此fflush(stdout)此时的工作是将stdout缓冲区中的内容通过文件描述符1,刷新到log.txt内核文件缓存区当中去,这时候log.txt中才能看到内容。也就是我们没有关闭fd1,那么新打开的log.txt的fd就是3,我们使用了dup2的效果就是,如果指定的文件是一个符号链接,原创 2024-05-13 16:49:01 · 845 阅读 · 9 评论 -
Linux--自主编写shell
while(*p!= '/') p--;}while(0)这里补充一下,如果命令输入错入,要删除重新输入。删除:CTRL+删除键退出自己写的shell:CTRL+c1.首先我们需要自己输出一个命令行lightmyshell]$ 获取用户名 主机名 所处的工作目录1.1获取用户名使用getenv函数从环境变量USER中获取值,并将其存储在名为name的类型的变量中。getenv函数返回指向该环境变量值的指针,如果该环境变量不存在,则返回NULL。1.2获取主机名。原创 2024-04-27 15:36:11 · 1518 阅读 · 3 评论 -
Linux--进程控制(2)--进程的程序替换(夺舍)
我们平时自己运行的程序,命令行参数和环境变量,是父进程通过将自己的环境变量表和命令行参数表通过,execvpe函数传递来的。它们通过替换当前进程的内存映像来执行新的程序,使得我们可以在一个进程中执行不同的程序,从而实现程序的切换和执行流程的改变。但他不是一个全新的程序,因为这个过程并没有创建新的进程,只是替换掉了原进程的数据和代码,依旧使用原来进task_struct,mm_struct,页表)一个新的程序来完全替代当前进程的内存映像,也就是替换掉原有的代码段、数据段和堆栈等内存管理的数据。原创 2024-04-27 09:58:20 · 911 阅读 · 6 评论 -
Linux--进程控制(1)
我们使用自定义的方式,来控制我们的返回信息(0:成功 1:除到0了 2 mod 0 了)原创 2024-04-26 10:18:42 · 870 阅读 · 3 评论 -
Linux--地址空间
父进程创建了变量g_val,100会存在于物理内存里(真实地址),但在这之前地址空间会给g_val一个虚拟地址,虚拟地址和真实地址都会被放在页表中,父进程通过页表使用虚拟地址就可以读取到g_val的值了。进程空间实际上就是操作系统给给每个进程画的饼,操作系统给每个进程的地址空间的大小都是真实物理内存的大小,比如真实的物理内存大小有100G,OS就会告诉每个进程,我会给你100G的大小供你使用, 这里给进程的100G就是地址空间,但这是虚拟内存,实际并没有那么大。其次,地址空间有助于实现进程间的独立性。原创 2024-04-21 19:08:31 · 655 阅读 · 0 评论 -
Linux--环境变量
当我们运行这个可执行程序的时候,就变成了进程,该进程的父进程就是Bash,Bash会构建命令行参数表,和命令行参数的个数传给main函数;如果我们也想让我们自己的程序执行的时候不需要加命令,我们可以将自己程序拷贝到上面的路径中去。我们发现,其实我们平时用的指令后面一般都会跟选项,为什么我们的指令可以有不同的选项,我们的选项跟不同的功能,这是因为指令和选项会传给它main函数中,对应的argc,argv来完成不同的功能,定义变量的本质,其实是开辟空间,在运行的期间我们的程序也能开辟空间。原创 2024-04-21 13:36:02 · 1083 阅读 · 6 评论 -
Linux--进程(2)
这篇继续来学习进程的其它知识Linux--进程(1)-CSDN博客。原创 2024-04-04 20:46:44 · 1117 阅读 · 2 评论 -
Linux--进程(1)
在学习进程之前,我们要明白先了解两个东西:1.体系结构----硬件上2.操作系统----软件上。原创 2024-03-22 16:38:45 · 745 阅读 · 12 评论 -
Linux--gdb(调试工具)
程序的发布方式有两种,debug模式和release模式Linux gcc/g++出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。原创 2024-03-08 13:44:31 · 1016 阅读 · 1 评论 -
Linux小程序--进度条
在这里模len是为了防止数组的越界这时就有了旋转的效果了。原创 2024-02-20 16:52:25 · 1074 阅读 · 7 评论 -
Linux项目自动化构建工具-make/Makefile
这里带来三个新的符号,@指代目标文件,^指代依赖文件列表(^可以指代文件列表中的所有文件),$符号的作用,可以理解成占位符。这里的操作其实是类似于C语言的宏,如果一个项目里有很多地方要用到这个文件,那么这种写法将会更加的方便简洁,如果想更改目标文件和依赖文件,那么只用修改两个地方就行了。这是为了提高编译的效率,makefile只需要对比可执行文件的最近修改时间和源文件最近的修改时间,谁更新就可以了,,mytest是目标文件,mytest后面跟的是依赖文件列表,如果有多个文件按照空格为分隔符;原创 2024-02-17 16:48:08 · 971 阅读 · 2 评论 -
Linux--编译器-gcc/g++使用
1.首先,我们来看一段样例(见一下)2.见完之后,我们来看一下程序的翻译过程3.了解一下翻译的过程为什么是这样的?再顺带谈一下编译器。4.最后,我们要谈一下动静态链接,看一下它们的特点和区别。原创 2024-02-16 11:01:26 · 1145 阅读 · 7 评论 -
Linux--基础开发工具篇(2)(vim)(配置白名单sudo)
在前面我们学习了yum,也就是Linux系统的应用商店Linux--基础开发工具篇(1)(yum)-CSDN博客今天我们开始学习Linux的第二个开发工具vim。原创 2024-02-11 18:20:54 · 1610 阅读 · 4 评论 -
Linux--基础开发工具篇(1)(yum)
yum是一个软件下载安装管理的一个客户端,就如小米应用商店,华为应用商城。Linux中软件包可能有依赖关系--yum会帮助我们解决依赖关系的问题。原创 2024-01-26 15:45:34 · 1405 阅读 · 3 评论 -
Linux--权限问题(2)
在权限问题(1)中,我们了解到:权限= 用户角色(具体的人)+文件权限的属性。本章我们将对用户角色和文件权限属性展开更加深入的解读。原创 2023-12-15 16:03:21 · 907 阅读 · 11 评论