
linux
文章平均质量分 81
linux基本知识点, 主要参考爱编程的大丙的主页, 加自己的理解
Liuuuu408
这个作者很懒,什么都没留下…
展开
-
基于UDP的套接字通信(附通信代码)
测试:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传。原创 2024-01-29 13:44:25 · 1173 阅读 · 0 评论 -
IO多路复用-epoll
epoll 全称 eventpoll,是 linux 内核实现IO多路转接/复用(IO multiplexing)的一个实现。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。select和poll每次都会线性扫描整个待检测集合,集合越大速度越慢,epoll使用的是回调机制,效率高,处理效率也不会随着检测集合的变大而下降。原创 2024-01-26 17:52:11 · 1467 阅读 · 1 评论 -
IO多路复用-poll(附通信代码)
nfds: 这是第一个参数数组中最后一个有效元素的下标 + 1(也可以指定参数1数组的元素总个数)fds: 这是一个struct pollfd类型的数组, 里边存储了待检测的文件描述符的信息。0:不阻塞,不管检测集合中有没有已就绪的文件描述符,函数马上返回。大于0:阻塞指定的毫秒(ms)数之后,解除阻塞。timeout: 指定poll函数的阻塞时长。原创 2024-01-25 12:13:35 · 584 阅读 · 0 评论 -
多线程select并发
还有就是在检测到有通信描述符在rdsert集合中被返回时, 在创建一个子线程, 完成通信操作。主线程在检测到有新的客户端连接之后, 创建一个子线程完成。是一个自定义的结构体。原创 2024-01-24 19:03:12 · 444 阅读 · 1 评论 -
IO多路复用-select(附通信代码)
I/O多路复用(I/O Multiplexing)是一种通过一种机制同时监听多个文件描述符(sockets、文件、设备等)的技术。它可以使一个进程在等待多个 I/O 操作完成时不会阻塞,从而提高程序的性能和响应性。通过这种方式在单线程/进程的场景下也可以在服务器端实现并发。。I/O多路复用的优势在于它可以有效地管理大量的连接,避免了创建大量线程或进程的开销。它适用于需要同时处理多个连接,但每个连接的数据流量相对较小的情况,如网络服务器、聊天程序等。原创 2024-01-24 17:27:34 · 1117 阅读 · 1 评论 -
基于线程池的TCP套接字通信
其中添加监听和通信任务函数的时候的参数问题需要创建两个结构体, 具体细节在代码中已经体现出来了。客户端的代码和线程池代码在之前的文章里已经有了, 都不变。原创 2024-01-22 18:41:23 · 509 阅读 · 0 评论 -
基于多线程的套接字通信
在多线程版的服务器端程序中,多个线程共用同一个地址空间,有些数据是共享的,有些数据的独占的。解决这种问题有多种方法, 我们先来看多线程解决。就是三个服务器和客户端在通信。原创 2024-01-22 11:34:02 · 731 阅读 · 2 评论 -
TCP重传, 滑动窗口, 流量控制, 拥塞控制
实际上「报文往返 RTT 的值」是经常变化的,因为我们的网络也是时常变化的。当接收端的缓冲区面临数据溢出时,窗口大小的值也是随之改变,设置为一个更小的值通知发送端,从而控制数据的发送量,这样达到流量的控制。所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以。原创 2024-01-21 14:33:36 · 1190 阅读 · 0 评论 -
TCP的三次握手和四次挥手
序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。确认应答号:指**下一次「期望」收到的数据的序列号**,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题。ACK:该位为1时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的SYN包之外该位必须设置为1。RST:该位为1时,表示 TCP 连接中出现异常必须强制断开连接。SYN。原创 2024-01-21 13:10:46 · 1089 阅读 · 0 评论 -
套接字通信(附带单线程TCP套接字通信代码)
当检测到有新的客户端连接请求时,阻塞解除,新连接就建立了,得到的返回值也是一个文件描述符,基于这个文件描述符就可以和客户端通信了。如果连接没有断开,接收端接收不到数据,接收数据的函数会阻塞等待数据到达,数据到达后函数解除阻塞,开始接收数据,当发送端断开连接,接收端无法接收到任何数据,但是这时候就不会阻塞了,函数直接返回0。总的来说,局域网和广域网在范围、连接设备、传输速度以及应用场景上有明显的区别,它们在网络体系中协同工作,为不同规模和需求的组织提供了灵活的网络解决方案。原创 2024-01-20 21:55:37 · 1091 阅读 · 0 评论 -
实现线程同步的几种方式
条件变量(Condition Variable)是一种多线程同步的机制,用于在多个线程之间建立通信。条件变量通常与互斥锁(Mutex)一起使用,以解决线程间的协调和同步问题。**条件变量用于在某个条件发生或者满足时通知其他线程。**典型的情况是,一个线程等待某个条件变为真,而另一个线程在某些情况下负责将条件设置为真,并通知等待的线程。这样,等待线程可以被唤醒并继续执行。原创 2024-01-11 16:31:48 · 1613 阅读 · 0 评论 -
什么是线程?
线程是计算机科学中的基本概念,指的是在一个进程中执行的独立指令流。通常,一个进程可以包含多个线程,它们共享进程的资源,如内存空间、文件句柄等,但每个线程有自己的独立执行流。线程是操作系统进行调度的最小单元进程是资源分配的最小单位),它由线程标识符、程序计数器、寄存器集合和堆栈组成。与进程不同,**线程之间可以更轻松地共享数据和通信,因为它们属于同一个进程,共享相同的地址空间。**这使得线程在并发编程中更为灵活,可以用于实现多任务并行执行。多线程的优点包括提高程序的响应性、资源共享和更高的系统利用率。原创 2024-01-10 20:15:40 · 1884 阅读 · 0 评论 -
什么是守护进程?
函数使自己成为新 session 的领头进程(会长),并且这个 session 领头进程还会被放入到一个新的进程组中。这个组中必须有一个组长, 组长就是进程组中的第一个进程,组长以外的都是普通的成员,每个进程组都有一个唯一的组ID,进程组的ID和组长的PID是一样的。注意,实际上守护进程的核心工作部分是一个简单的无限循环,我们可以根据实际需求来添加守护进程的具体逻辑。一个普通的进程可以调用。获取指定的进程所在的进程组的组ID,参数 pid 就是指定的进程。将某个进程移动到其他进程组中或者创建新的进程组。原创 2024-01-10 11:05:47 · 909 阅读 · 0 评论 -
信号-进程间通信
在 Linux 操作系统中,信号是一种进程间通信的机制,用于通知进程发生了某个事件。信号可以由内核、其他进程,或者进程自身发送。每个信号都对应一个特定的事件或异常,例如进程终止、Ctrl+C 中断等。本质上是一个整数,不同的信号对应不同的值,由于信号的结构简单所以天生不能携带很大的信息量,但是信号在系统中的优先级是非常高的。非常不建议使用信号进行进程间通信。信号集(Signal Set)是用于表示一组信号的数据结构。原创 2024-01-10 10:10:44 · 918 阅读 · 0 评论 -
进程间的通信方式-共享内存和内存映射区的区别
shm:进程退出对共享内存没有影响,调用相关函数/命令/ 关机才能删除共享内存。数据的完整性 -> 突发状态下数据能不能被保存下来(比如: 突然断电)shm: 直接对内存操作,效率高。实现进程间通信的方式。原创 2024-01-09 15:12:36 · 431 阅读 · 0 评论 -
共享内存-进程间通信
共享内存是一种进程间通信的机制,它允许多个进程在它们的地址空间中映射相同的一块物理内存,从而实现进程之间的数据共享。通过共享内存,不同进程可以直接读取和写入这块内存,而无需经过内核空间,因此通常比其他进程间通信机制更为高效。在所有进程间通信的方式中共享内存的效率是最高的。共享内存允许多个进程直接访问相同的内存区域,无需通过中间缓冲区或消息传递的方式,提高了数据传输的效率。由于不涉及内核空间的数据传输,共享内存通常比其他进程间通信方式(如管道或消息队列)更为高效。原创 2024-01-09 15:10:28 · 1088 阅读 · 0 评论 -
内存映射-进程通信
管道的读写是阻塞的,内存映射区的读写是非阻塞的。内存映射区创建成功之后,得到了映射区内存的起始地址,使用相关的内存操作函数读写数据就可以。通信的进程需要将各自的内存映射区和同一个磁盘文件进行映射,这样进程之间就可以通过磁盘文件这个唯一的桥梁完成数据的交互了。length: 创建的内存映射区的大小(单位:字节),实际上这个大小是按照4k的整数倍去分配的。由于每个进程的地址空间是独立的,各个进程之间也不能直接访问对方的内存映射区,需要**prot: 对内存映射区的操作权限。实现进程间通信,还可以通过函数。原创 2024-01-08 19:42:58 · 391 阅读 · 0 评论 -
进程间通信方式-管道
管道(Pipe)是一种在 Unix/Linux 等操作系统中**用于进程间通信的机制**。它可以用于在两个相关的进程之间传递数据,实现简单的数据流通信。管道分为匿名管道和命名管道(FIFO)两种。管道的本质其实就是内核中的一块内存(或者叫内核缓冲区),这块缓冲区中的数据存储在一个环形队列中,因为管道在内核里边,因此我们不能直接对其进行任何操作。管道对应的内核缓冲区大小是固定的,默认为4k(也就是队列最大能存储4k数据)管道分为两部分:读端和写端(队列的两端),数据从写端进入管道,从读端流出管道。原创 2024-01-08 15:59:40 · 995 阅读 · 0 评论 -
进程控制-操作系统
进程和程序的区别:程序和进程是两个不同的概念,他们的状态,占用的系统资源都是不同的。程序:就是磁盘上的可执行文件文件, 并且只占用磁盘上的空间,是一个静态的概念。被执行之后的程序叫做进程不占用磁盘空间,需要消耗系统的内存,CPU资源,每个运行的进程的都对应一个属于自己的虚拟地址空间,这是一个动态的概念。原创 2024-01-05 20:44:44 · 1133 阅读 · 0 评论 -
文件描述符复制和重定向
(file control)是一个用于对文件描述符进行各种控制操作的系统调用。它提供了一系列功能,包括文件状态标志的设置和获取、文件锁定、以及对文件描述符的其他控制操作。,然后可以通过这两个文件描述符来独立地对同一文件进行操作。返回的新文件描述符是系统中当前可用的最小文件描述符。主要介绍另几个可以用来分配文件描述符的函数。函数是用于复制文件描述符的系统调用,与。以下是一个简单的示例,演示如何使用。以下是一个简单的示例,演示如何使用。,生成了一个新的文件描述符。在上述示例中,dup2。原创 2024-01-04 15:46:13 · 1025 阅读 · 0 评论 -
文件属性信息
在stat命令中,-c参数用于自定义输出格式。通过-c参数,你可以指定输出的信息,并使用一些格式控制符来代表文件的各种属性。下面是一些常用的-c%a:文件权限,八进制表示。%A:文件权限,人类可读表示。%n:文件名。%s:文件大小(以字节为单位)。%b:文件的块数。%B:每块的字节数。%d:设备编号。%i:文件的 inode 号。%U:文件所有者的用户名。%G:文件所属组的组名。%x:文件的最后访问时间。%y:文件的最后修改时间。%z:文件的最后变化时间。下面是一个使用-c参数的。原创 2024-01-03 17:20:20 · 2211 阅读 · 0 评论 -
Bash和Shell有什么区别?
但其他的 Shell,比如 sh、csh、zsh,也是可用的。,但不是所有的 Shell 都是 Bash。原创 2024-01-03 16:36:18 · 1384 阅读 · 0 评论 -
Linux系统文件IO
当我们需要下载很大的文件时, 磁盘紧张, 如果不能马上将文件下载到本地, 磁盘可能会被占用, 这时可以现将字符写入到目标文件中, 让扩展的文件和被下载的文件一样大即可。在前面介绍了文件描述符,在Linux系统中必须要使用系统提供的IO函数才能基于这些文件描述符完成对相关文件的读写操作。函数用于打开一个文件,并返回一个文件描述符,该文件描述符在后续的文件操作中被用作文件的标识符。不管是使用这两个函数还是使用 lseek() 函数拓展文件,文件尾部填充的字符都是 0。函数用于从已打开的文件描述符中读取数据。原创 2024-01-03 10:41:11 · 943 阅读 · 0 评论 -
文件描述符
*文件描述符是进程级的,每个进程都有它自己的文件描述符表。通过open()函数打开 /hello.txt,文件描述符 3 被分配给了这个文件,保持这个打开状态,再次通过open()函数打开 /hello.txt,文件描述符 4 被分配给了这个文件,也就是说一个进程中不同的文件描述符打开的磁盘文件可能是同一个。文件描述符(file descriptor,简称fd),当在进程中打开一个现有文件或者创建一个新文件时,内核向该进程返回一个文件描述符,用于对应这个打开/新建的文件。一些基本的系统调用,比如。原创 2023-12-31 15:03:47 · 464 阅读 · 0 评论 -
虚拟地址空间
虚拟地址空间是指操作系统为每个运行中的进程分配的抽象地址空间。这个地址空间使得每个进程都觉得它拥有一个独立的、连续的内存区域,而实际上这个内存区域可能分布在物理内存的不同位置,甚至可能被存储在磁盘上。在虚拟地址空间中,进程访问的是虚拟地址,而不是实际的物理地址。操作系统(MMU, 内存管理单元, Memory Management Unit)负责将虚拟地址映射到物理地址,这个过程称为地址转换。通过虚拟地址空间,操作系统可以为每个进程提供独立的、隔离的内存空间,从而增加了系统的稳定性和安全性。原创 2023-12-31 15:02:01 · 1730 阅读 · 0 评论 -
GDB调试
*GDB(GNU Debugger)**是一款用于调试程序的开源调试工具,它是 GNU 工具集的一部分。GDB 可以用于调试多种编程语言,包括 C、C++、Fortran 和其他一些语言。原创 2023-12-29 15:15:57 · 894 阅读 · 0 评论 -
makefile进阶版
用户可以定义自己的变量,称为用户自定义变量。makefile 中的变量是没有类型的直接创建变量然后给其赋值就可以了。# 错误, 只创建了变量名, 没有赋值变量名# 正确, 创建一个变量名并且给其赋值变量名=变量值取出变量的值# 如果将变量的值取出?$(变量的名字)# 举例 add.o div.o main.o mult.o sub.o# 定义变量并赋值# 取变量的值$(obj)自定义变量使用举例# 这是一个规则,普通写法# 这是一个规则,里边使用了自定义变量。原创 2023-12-25 10:19:31 · 926 阅读 · 0 评论 -
makefile基础版
使用 GCC 的命令行进行程序编译在单个文件下是比较方便的,当工程中的文件逐渐增多,甚至变得十分庞大的时候,使用 GCC 命令编译就会变得力不从心。这种情况下我们需要借助项目构造工具 make 帮助我们完成这个艰巨的任务。,一般来说,大多数的IDE都有这个命令,比如:Visual C++的nmake,QtCreator的qmake等。make工具在构造项目的时候需要加载一个叫做makefile的文件,makefile关系到了整个工程的编译规则。原创 2023-12-24 17:31:44 · 862 阅读 · 0 评论