![](https://img-blog.csdnimg.cn/022fe90af52d4fe0a5f97e5410676007.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux学习
文章平均质量分 95
本专栏我将和大家一起学习Linux。
momo小菜pa
momo
展开
-
Linux--网络基础
TCP/IP 协议的本质是一种解决方案,为了解决上面的问题然而上面的问题性质不同,种类不同,导致协议的性质不同,种类不同,所以协议是要分层处理的。TCP/IP 协议能分层, 前提是因为问题们本身能分层。原创 2024-07-24 15:52:57 · 536 阅读 · 0 评论 -
Linux--实现线程池(万字详解)
IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是 设计模式。原创 2024-07-19 18:14:23 · 780 阅读 · 1 评论 -
Linux--信号量
由于环形队列的下标也是属于临界资源的,如果不维持关系内部的互斥关系,是一定会破坏环形队列结构的。当一个线程(或进程)获取了信号量(将其值从1减为0),它便获得了对某个共享资源的独占访问权,其他试图获取该信号量的线程将被阻塞,直到信号量被释放(其值从0加回1)。sem_post函数用于信号量的V操作,主要作用是给信号量的值加上一个“1”,并可能唤醒一个或多个在该信号量上等待的线程。该函数用于信号量的P操作,从信号量的值中减去1,如果信号量的值变为0,则当前线程将被阻塞,直到信号量的值被其他线程通过。原创 2024-07-18 15:16:24 · 1150 阅读 · 0 评论 -
Linux--线程同步
当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)线程同步同样是需要互斥锁来实现的,但不同的是:线程同步,程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息或状态。同步的目的是确保线程之间。由于生产者和消费者之间的解耦和并行处理能力,生产者消费者模型可以很容易地扩展到处理更多的数据或更复杂的任务。1.这两个的顺序是没有关系,因为无论是消费过程,还是生产过程,都是要持有锁的,唤醒后是要重新申请锁的。原创 2024-07-17 10:35:15 · 806 阅读 · 3 评论 -
Linux--线程互斥(加锁)
(即它在编译时就已经分配了内存空间)原创 2024-07-15 23:10:21 · 946 阅读 · 2 评论 -
Linux--线程ID&&封装管理原生线程
我们生成的可执行程序在没运行的时候,当然也是在磁盘中的。当运行的时候,我们的可执行程序要加载到内存中,程序要变成一个进程的时候,它的PCB和内核数据结构要被创建出来,通过页表映射到可执行程序的代码和数据。库中创建一个线程,会为线程申请一个内存块(每创建一个线程申请一个内存块),所有的块都是连续存储的,内存块就是一个大号的结构体,内存块中存在线程在用户及最基本的属性和线程栈,这个栈是线程独立的栈结构。所以线程的概念,只是在库中表现出来的,所以我们把Linux中的线程称之为:用户级线程。原创 2024-07-10 15:46:39 · 908 阅读 · 0 评论 -
Linux--线程的控制
线程的创建,终止,等待,分离新线程如何终止?1. 线程函数 return3. main thread call pthread_cancel, 新线程退出结果是-1。原创 2024-07-09 17:15:19 · 1070 阅读 · 3 评论 -
Linux--线程(概念篇)
我们都知道系统和磁盘文件进行IO的基本单位是内存块4KB--8个扇区。我们以4GB大小的物理内存为例,物理内存被分为一个一个的页框,一个页框的大小也就是4KB,那么我们也就清楚了,磁盘加载到物理内存,操作系统会从磁盘中读取该页面并将其加载到物理内存中的一个页框/页帧中。在父子进程进行共享内存的全局变量int只占四个字节,我对他写入时要发生写时拷贝,写时拷贝的本质就让操作系统重新申请内存,那么拷贝的时候是拷贝四个字节还是4kb呢?对于全局变量int的写入操作,通常不会触发写时拷贝。原创 2024-07-08 22:41:28 · 1279 阅读 · 2 评论 -
Linux--信号(万字详解!超完整!)
我们都知道,在管道通信时,读端关闭,写端一直进行,写就没有意义了,这时候操作系统,就会向进程发送SIGPIPE(13号信号),终止进程。原创 2024-07-05 20:39:01 · 831 阅读 · 4 评论 -
Linux--进程间通信(system V共享内存)
这意味着,我们给两个进程使用同样的pathname和同样的id,调用同样的ftok,就能形成同样的key了。当多个进程都映射了同一块共享内存到各自的地址空间后 ,进程A可以将数据写入共享内存,然后进程B可以从共享内存中读取这些数据,从而实现进程间的数据交换。因为即使其他进程知道了你的共享内存段的键,它们也无法直接访问或修改你的共享内存段,除非它们也通过。key:属于用户形成,内核使用的一个字段,用户不能使用key来进行shm的管理,是给内核用来区分shm唯一性的(用户给操作系统用的)来指示具体的错误原因。原创 2024-06-07 16:02:15 · 931 阅读 · 8 评论 -
Linux--进程间通信(2)(有名管道)
这使得任何进程都可以通过该名称来访问管道,而不必是创建管道的进程的子进程。有名管道支持不同进程间的通信,甚至支持跨计算机(网络)的通信。有名管道的生命周期由创建它的进程控制,但即使创建它的进程终止,只要还有进程连接着管道,管道就会继续存在。命名管道在操作系统中表现为一种特殊类型的文件,它存在于系统的命名空间中,可以像打开文件那样被打开和读写。一旦创建,命名管道就可以在不同的进程中被打开多次,允许单向或双向的数据流传输。提供一个namepipe的类,它封装了命名管道的创建、打开、读写和删除的逻辑。原创 2024-05-28 13:43:46 · 746 阅读 · 2 评论 -
Linux--构建进程池
如果我们是关一个等待一个,那么第一个信道,只会关闭一个读端,但还有其它的读端,这就会发生进程阻塞,导致管道文件一直在等待读取,无法被释放;如果统一的关闭读端,那么当关闭到最后一个信道的时候,最后一个信道读端只有一个,管道文件会被释放,然后就会递归式的逆向关闭其它信道的所有读端,最后将所有的管道文件释放,父进程只需要一 一等待,就能回收所有子进程了。下面函数的主要逻辑是创建多个管道和相应的子进程,每个子进程都将从它自己的管道中读取数据,而父进程则保留管道的写端以便后续向子进程发送数据。,然后关闭读端并退出。原创 2024-05-28 13:43:13 · 1069 阅读 · 2 评论 -
Linux--动静态库制作使用及使用
我们在执行这段代码的时候,调用了里面的函数,我们没有该函数的实现,但可以使用它,是因为我们链接了它们的库,有gcc编译器完成链接,ldd可以查看当前可执行程序链接了上面库。综上所述,动态库和静态库各有优缺点,适用于不同的场景和需求。静态库在编译期间,就把库中的方法拷贝到了程序当中,未来加载就只谈论程序加载,与库没有关系,所以我们再谈库的加载时,不考虑 静态库,只考虑动态库。既然系统找不到我们的库文件,那么我们直接将库文件拷贝到系统共享的库路径下,这样一来系统就能够找到对应的库文件了。选项表示创建一个库。原创 2024-05-19 14:14:00 · 689 阅读 · 8 评论 -
Linux--软硬链接
例如,如果目录A硬链接到目录B,而目录B又硬链接回目录A,那么在遍历目录结构时,系统可能会陷入无限循环,导致无法正确定位或访问目录。当我们说一个目录的引用计数为2时,这通常是因为每个目录在其父目录中都有一个条目(即一个硬链接),并且它自己还有一个指向自己的。删除一个文件名和inode的关系,引用计数就变为1,再将硬链接删除,引用计数变为0,此时文件才会被删除。那如果我们的可执行程序被放到了一个很深的路径下,我们就只能这样运行我们的可执行程序,这就十分的麻烦了。和建立软连接的区别就是,少了一个-s选项。原创 2024-05-18 13:53:05 · 1091 阅读 · 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 · 830 阅读 · 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 · 1442 阅读 · 3 评论 -
Linux--进程控制(2)--进程的程序替换(夺舍)
我们平时自己运行的程序,命令行参数和环境变量,是父进程通过将自己的环境变量表和命令行参数表通过,execvpe函数传递来的。它们通过替换当前进程的内存映像来执行新的程序,使得我们可以在一个进程中执行不同的程序,从而实现程序的切换和执行流程的改变。但他不是一个全新的程序,因为这个过程并没有创建新的进程,只是替换掉了原进程的数据和代码,依旧使用原来进task_struct,mm_struct,页表)一个新的程序来完全替代当前进程的内存映像,也就是替换掉原有的代码段、数据段和堆栈等内存管理的数据。原创 2024-04-27 09:58:20 · 900 阅读 · 6 评论 -
Linux--进程控制(1)
我们使用自定义的方式,来控制我们的返回信息(0:成功 1:除到0了 2 mod 0 了)原创 2024-04-26 10:18:42 · 844 阅读 · 3 评论 -
Linux--地址空间
父进程创建了变量g_val,100会存在于物理内存里(真实地址),但在这之前地址空间会给g_val一个虚拟地址,虚拟地址和真实地址都会被放在页表中,父进程通过页表使用虚拟地址就可以读取到g_val的值了。进程空间实际上就是操作系统给给每个进程画的饼,操作系统给每个进程的地址空间的大小都是真实物理内存的大小,比如真实的物理内存大小有100G,OS就会告诉每个进程,我会给你100G的大小供你使用, 这里给进程的100G就是地址空间,但这是虚拟内存,实际并没有那么大。其次,地址空间有助于实现进程间的独立性。原创 2024-04-21 19:08:31 · 628 阅读 · 0 评论 -
Linux--环境变量
当我们运行这个可执行程序的时候,就变成了进程,该进程的父进程就是Bash,Bash会构建命令行参数表,和命令行参数的个数传给main函数;如果我们也想让我们自己的程序执行的时候不需要加命令,我们可以将自己程序拷贝到上面的路径中去。我们发现,其实我们平时用的指令后面一般都会跟选项,为什么我们的指令可以有不同的选项,我们的选项跟不同的功能,这是因为指令和选项会传给它main函数中,对应的argc,argv来完成不同的功能,定义变量的本质,其实是开辟空间,在运行的期间我们的程序也能开辟空间。原创 2024-04-21 13:36:02 · 1049 阅读 · 6 评论 -
Linux--进程(2)
这篇继续来学习进程的其它知识Linux--进程(1)-CSDN博客。原创 2024-04-04 20:46:44 · 1103 阅读 · 2 评论 -
Linux--进程(1)
在学习进程之前,我们要明白先了解两个东西:1.体系结构----硬件上2.操作系统----软件上。原创 2024-03-22 16:38:45 · 727 阅读 · 12 评论 -
Linux--gdb(调试工具)
程序的发布方式有两种,debug模式和release模式Linux gcc/g++出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项。原创 2024-03-08 13:44:31 · 973 阅读 · 1 评论 -
Linux小程序--进度条
在这里模len是为了防止数组的越界这时就有了旋转的效果了。原创 2024-02-20 16:52:25 · 1052 阅读 · 7 评论 -
Linux项目自动化构建工具-make/Makefile
这里带来三个新的符号,@指代目标文件,^指代依赖文件列表(^可以指代文件列表中的所有文件),$符号的作用,可以理解成占位符。这里的操作其实是类似于C语言的宏,如果一个项目里有很多地方要用到这个文件,那么这种写法将会更加的方便简洁,如果想更改目标文件和依赖文件,那么只用修改两个地方就行了。这是为了提高编译的效率,makefile只需要对比可执行文件的最近修改时间和源文件最近的修改时间,谁更新就可以了,,mytest是目标文件,mytest后面跟的是依赖文件列表,如果有多个文件按照空格为分隔符;原创 2024-02-17 16:48:08 · 951 阅读 · 2 评论 -
Linux--编译器-gcc/g++使用
1.首先,我们来看一段样例(见一下)2.见完之后,我们来看一下程序的翻译过程3.了解一下翻译的过程为什么是这样的?再顺带谈一下编译器。4.最后,我们要谈一下动静态链接,看一下它们的特点和区别。原创 2024-02-16 11:01:26 · 1120 阅读 · 7 评论 -
Linux--基础开发工具篇(2)(vim)(配置白名单sudo)
在前面我们学习了yum,也就是Linux系统的应用商店Linux--基础开发工具篇(1)(yum)-CSDN博客今天我们开始学习Linux的第二个开发工具vim。原创 2024-02-11 18:20:54 · 1537 阅读 · 4 评论 -
Linux--基础开发工具篇(1)(yum)
yum是一个软件下载安装管理的一个客户端,就如小米应用商店,华为应用商城。Linux中软件包可能有依赖关系--yum会帮助我们解决依赖关系的问题。原创 2024-01-26 15:45:34 · 1324 阅读 · 3 评论 -
Linux--权限问题(2)
在权限问题(1)中,我们了解到:权限= 用户角色(具体的人)+文件权限的属性。本章我们将对用户角色和文件权限属性展开更加深入的解读。原创 2023-12-15 16:03:21 · 849 阅读 · 11 评论 -
Linux--初识和基本的指令(3)
在前面两节我们学习了:1.linux用户下有自己的家目录,对于root账号:默认的家目录/root;对于普通用户的家目录:/home/XXX,XXX是新建的用户名。2.指令的本质就是程序。3.Linux是多用户的操作系统。4.在Linux中一切皆文件。5.一些指令。本节我们将分成指令,理论两条线路去学习Linux更多的内容。本节重点:1. 造出一个大文件2. 查看大文件中内容的指令3.输出重定向,追加重定向,输入重定向,管道4.日志,日历,时间戳5.打包压缩文件。原创 2023-12-02 15:45:17 · 869 阅读 · 16 评论 -
Linux--权限问题(1)
在前面我们学习了Linux基本的指令操作,本节我们将进入Linux权限的学习。本节重点:1.剩余的几条指令(tar),(sz,rz,scp)(uname)2.Linux中的用户和权限操作3.权限所引出的问题。原创 2023-12-08 15:24:57 · 308 阅读 · 3 评论 -
Linux--初识和基本的指令(2)
本章我们将学习更多的Linux指令,和大家进一步了解Linux ,最后会介绍如何用Linux编写代码。原创 2023-11-23 16:49:09 · 193 阅读 · 15 评论 -
Linux--初识和基本的指令(1)
这篇文章是帮助大家搭建Linux环境,让大家认识一下Linux操作系统,接着了解几条Linux的指令。请大家着重注意:1.Linux文件是树状结构的。3.根目录。3.绝对路径和相对路径。4.关于对文件的理解。操作系统就是一款进行硬件和软件资源管理的软件。列如:windows,开机的过程就是在加载windows操作系统1.对下提供基本的管理工具,让各种硬件工作在一个稳定的,高效的,安全的状态当中。2.对上提供一个高效的,稳定的,安全的运行环境。Linux是操作系统的一个品类。原创 2023-11-18 15:45:34 · 273 阅读 · 11 评论