Linux
文章平均质量分 72
Linux学习
lge101058
这个作者很懒,什么都没留下…
展开
-
【Linux】进程信号_3
在进程的PCB中,有两个位图,一个是判断是否收到相应信号的位图pending,一个是决定该位置的信号是否阻塞的位图block。注意,阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。信号从产生到递达之间的状态,称为信号未决(Pending)。9号信号、19号信号无法被屏蔽,18号信号会做特殊处理。可以读取或更改进程的信号屏蔽字(阻塞信号集)。进程可以选择阻塞 (Block )某个信号。原创 2024-06-26 21:40:17 · 161 阅读 · 0 评论 -
【Linux】进程信号_2
我们之前学管道通信的时候,当具有读功能的进程关闭读端时,此时由于写操作将毫无意义,所以软件会产生信号给具有写功能的进程,使其关闭写端。,可以通过捕获信号的方式再次设定闹钟。abort函数的作用是给自己发送固定信号(6号信号),终止进程。命令和键盘来生成信号,我们也可以使用系统调用来生成信号。alarm函数是一个闹钟,可以经过指定秒后发送。kill函数可以对指定进程发送指定信号。raise可以让进程自己调用指定信号。这里是除0异常,我们来看看会怎样。这里产生的信号是 8号信号。异常情况也可以产生信号。原创 2024-06-26 18:19:37 · 249 阅读 · 0 评论 -
【Linux】进程信号_1
当信号产生时,可选的处理方式有三种:①忽略此信号。②执行该信号的默认处理动作。③自定义处理信号,这种方式称为捕捉(Catch)一个信号。信号和信号量之间没有任何关系。信号是Linux系统提供的让用户/进程给其他进程发送异步信息的一种方式。此时进程当接收到2号信号时,就输出了一句话并没有终止进程。接下来我们让进程对2号信号做出自定义行为。信号可以由 kill 命令产生,也能够从键盘上产生。会被操作系统解释成2号信号。函数这样设置时,就代表将。原创 2024-06-25 21:08:18 · 731 阅读 · 0 评论 -
【Linux】进程间通信_4
每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核。所有的进程访问临界资源,都需要申请信号量,所有的进程都必须要看到同一个信号量,说明信号量本身就是一个共享资源。进程访问临界资源本质就是申请信号量,申请成功才能访问临界资源,否者只能等待申请。我们申请的共享内存,如果进程结束了,但共享内存并不会释放,需要我们手动释放。管道文件的生命周期是随进程的,但是共享内存的生命周期是随内核的。原创 2024-06-25 19:16:05 · 387 阅读 · 0 评论 -
【Linux】进程间通信_3
管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。命名管道是一种特殊类型的文件。命令就可以在当前路径下创建命名管道。原创 2024-06-24 23:27:37 · 400 阅读 · 0 评论 -
【Linux】进程间通信_2
②管道内部被写满,并且具有读端的继承没有关闭读端,写端写满管道pipe后,就需要阻塞等待,直到管道清空。③对于写端而言:关闭了写端管道,读端会将管道pipe中的数据读完,最后会读到返回值0,表示读取完毕。①管道内部没有数据,并且具有写端的进程没有关闭写端,读端就要阻塞等待,知道管道pipe内部有数据。④对于读端而言:关闭了读端管道,操作系统会直接终止具有写端的进程,通过十三号信号。④父子退出,管道自动释放,文件的生命周期是随进程的。②通过血缘关系进程进行通信,常见为父子进程。我们曾经学的命令行管道。原创 2024-06-24 20:51:17 · 548 阅读 · 0 评论 -
【Linux】进程间通信_1
但是我们通常需要多个进程协同,共同完成一件事,所以我们需要进程间通信的手段。进程间通信的本质就是先让不同的进程看到同一份资源,这个资源一般都是由操作系统提供。pipe函数的作用是创建一个管道,用于进程间通信,参数需要一个两个元素的数组,数组1用来读取管道数据,数组2用来向管道中写入数据。方式打开同一个文件就形成了管道,这个文件已经被加载在内存中,不需要向磁盘中刷新的方式叫做。匿名管道是如何让不同的进程看到同一份资源的呢?子进程会继承父进程的所有熟悉信息。父进程和子进程分别使用。这里的管道就是文件。原创 2024-06-23 21:25:37 · 566 阅读 · 0 评论 -
【Linux】基础IO_4
因为我之前编译的时候只是告诉了编译器我们的链接文件和头文件在哪,现在是运行当中,操作系统并不知道链接文件在哪。所以我们应该怎么解决呢?如果我们只提供静态链接,那么程序会对这个库进行局部静态链接,程序的其他库仍可能是动态链接的。如果我们只提供动态库,强制使用静态链接则会发生链接报错。如果我们同时提供动态库和静态库,gcc默认使用的是动态库。如果我们非要静态链接,我们必须使用static选项。所有系统进程中公共的代码和数据,只需要在物理内存中存在一份即可。命令就是告诉编译器我们链接的库在哪个路径下。原创 2024-06-22 22:09:02 · 301 阅读 · 0 评论 -
【Linux】基础IO_3
硬链接的本质就是在指定的目录下,插入新的文件名和目标文件的映射关系,并让inode的引用计数++。我们之前使用过库,也对库有一定的了解,这里我们将对库进行更深入的理解。可以给目录建立软链接,但是不能建立硬链接(除非系统建立的)。即便是我们没有实现 mymath 库中函数,我们同样可以用。可以通过目录的硬链接数 -2 计算得到目录有多少个子目录。软链接的本质就是一个独立文件,软链接内容里面放的是。硬链接数从 1 变成 0 后才会清空文件的信息。文件的删除本质上是减少硬链接数。可以创建软链接,直接使用。原创 2024-06-22 22:06:51 · 912 阅读 · 0 评论 -
【Linux】基础IO_2
未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。文件的内容大小不确定,但是文件的属性大小是确定的(文件的名称不是文件的属性!),因此文件的内容和文件的属性不会存在一起。文件的属性是一个结构体,里面存着文件的属性。系统中不是所有对文件都是打开的状态,大部分的文件都是没有被打开的。而文件就存储在这一个个扇区当中。文件的属性的结构体中存储着文件内容所在的块的编号,通过这个编号就能找到相应的文件。原创 2024-06-20 16:36:19 · 395 阅读 · 0 评论 -
【Linux】基础IO_1
在操作系统内部,进程PCB中存储着一个结构体指针,指向一个文件描述符表,这个表是一个结构体指针数组,内部存的是文件结构体指针,分别指向不同的打开的文件。我们从键盘接收输入,打印到显示器上,但键盘和显示器都是硬件资源,他们统统被操作系统所管理,我们的文件(进程)无法绕过操作系统打开这些资源,所以操作系统必须要提供一些接口来支持文件访问。所以我们可以:close(1),即关闭stdout流,然后新打开的文件的fd就是1,但是输出函数并不知道,向显示器打印的字符串统统转变成向文件内写入。那打开文件是什么意思呢?原创 2024-06-19 17:13:10 · 547 阅读 · 1 评论 -
【Linux】进程_9
根据我们之前学的知识,这里来编写一个 shell 程序。102464// 用户名// 主机名// 路径上面代码可以通过环境变量接口获取指定信息。我们先输出一下命令行提示符试试看。封装输出命令行提示符的信息和接收用户输入成一个函数。我们获取到了用户一行输入的整个字符串,现在需要对这个字符串进行切割。// 分隔符是空格int i = 0;当做完以上操作后就可以执行命令了,我们创建一个子进程,让子进程来程序替换为我们要执行的命令。我们封装一下执行命令。原创 2024-06-18 15:50:57 · 354 阅读 · 0 评论 -
【Linux】进程_8
阻塞等待就是当父进程没有收到子进程的返回结果时,会在此阻塞,非阻塞等待就是父进程没有收到子进程的返回结果时,仍可以执行其他代码,并不会将父进程阻塞至此。我们知道,创建一个进程时,先创建的是 PCB,地址空间,页表等,然后再将程序加载到内存,将程序加载到内存与程序替换的本质是一样的。由于进程具有独立性,子进程替换的时候会发生写实拷贝,所以不影响父进程的代码,父进程同样可以等待子进程的返回结果。这个参数其实就是进程的返回结果,当子进程结束的时候,就会返回这个值给父进程。进程程序替换,不会替换环境变量数据。原创 2024-06-17 22:24:53 · 562 阅读 · 0 评论 -
【Linux】进程_7
申请内存时,其实是向虚拟地址申请合法空间,此时页表并不将申请的虚拟地址空间映射到物理地址,即此时并没有申请到合法的物理空间,知道我们向申请的空间中写入的时候,页表才会映射物理地址,才真正的申请了内存中的物理空间,然后向物理空间中写入。我们上节知道了进程地址空间是根据页表来使虚拟地址转换成内存中的物理地址,那这种 地址空间 + 页表 的机制有什么好处呢?父进程通过进程等待的方式,回收子进程资源(必要的,防止出现僵尸进程),获取子进程退出信息(可选的)。进程的退出场景:①代码运行完毕,结果正确。原创 2024-06-17 17:13:57 · 357 阅读 · 0 评论 -
【Linux】进程_6
操作系统会将进程地址空间给描述成一个特定的数据结构的对象,从而将对进程地址空间的管理转变为对数据结构的增删改查。由于进程地址空间并不是内存,所以不具有储存数据的能力,其地址都是虚拟的,所以我们需要一张。所以说,这个地址绝对不是真正的地址,绝对不是。同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址。在上面的空间布局图中,有一个疑问,画的空间是。因此,上面的空间布局图并不是内存,而是。页表也是被操作系统所描述的一种数据结构。每一个进程都会有一个进程地址空间。原创 2024-06-16 22:49:55 · 662 阅读 · 0 评论 -
【Linux】进程_5
操作系统和应用程序可以通过读取环境变量来获取在运行过程中可能需要的参数和配置信息。当然不仅仅只有 PATH 环境变量,还有许多其他环境变量。进程在运行过程中,要产生大量的临时数据,存放在CPU的寄存器中,CPU内部的所有临时数据我们叫做进程的。环境变量不是一个,而是一堆,彼此之间没有关系,一般是操作系统内置的具有特殊用途的变量。才能执行,就是因为系统命令的路径被保存到了 PATH 环境变量当中。当进程的时间片到了时,会被调度走,上下文会保存在进程的。环境变量具有全局属性,可以被子进程或孙子进程继承。原创 2024-06-16 15:22:59 · 1197 阅读 · 0 评论 -
【Linux】进程_4
如果父进程比子进程先挂掉,就无法读取子进程的结果数据,以至于子进程无法被杀掉,永久成为僵尸进程。竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。进程在运行的时候在CPU上,CPU是一定把进程跑完再跑其他进程吗?Linux的优先级是可以被修改的,优先级的范围是[60, 99],并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。(zombie) — 僵尸状态(进程已经死亡,但是父进程尚未读取子进程的结果数据,原创 2024-06-15 20:55:53 · 490 阅读 · 0 评论 -
【Linux】进程_3
我们可以看到,我们输出了一个 befor fork,但是输出了两个 after fork,这是因为,fork函数创建了一个子进程,该子进程共享下面的代码。该子进程的父进程是可执行程序的进程。当计算机的资源(内存)比较吃紧时,操作系统会将部分进程从内存中转到外存中,为计算机的内存“腾空间”。进程不是一直在运行的,即使进程放在了CPU上,也不是一直运行的。CPU是资源,具有运行队列,其他的软硬件资源同样有队列,是等待队列。有了不同的返回值,就可以控制后面代码对不同进程进行分流,不同进程做不同的代码块。原创 2024-06-14 15:05:59 · 356 阅读 · 0 评论 -
【Linux】进程_2
根据冯—诺依曼结构体系,程序想要被执行,必须从磁盘中拷贝到内存当中,一旦程序进入内存,操作系统为了对其进行。,在Linux中,普通进程都有其父进程(创建该进程的进程),ppid 就是父进程标识符。I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。由上一段可知,进入内存的程序并不算是进程,在内核方面,原创 2024-06-13 21:30:14 · 509 阅读 · 0 评论 -
【Linux】进程_1
操作系统与硬件交互,管理所有的软硬件资源,为用户程序(应用程序)提供一个良好的执行环境。不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)。,由于CPU的速度非常块,引入内存则可以通过预加载方式使计算机效率更快。我们常见的计算机和不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。起来,使对硬件(被管理者)的操作都可以抽象成对数据结构的增删改查。任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。内核(进程管理,内存管理,文件管理,驱动管理)。原创 2024-06-12 21:09:15 · 168 阅读 · 0 评论 -
【Linux】Linux环境基础开发工具_6
我们已经可以写代码了,也能够执行代码了,但是代码错了该如何调试呢?undisplay + 变量编号:取消 display 常显示的变量。display + 变量名:显示变量的当前值(常显示)。set var + 变量名 + 值:修改一个变量的内容。until + 行号:在一个范围内,直接运行到指定行。p + 变量名:显示变量的当前值(不是常显示)。disable + 断点编号:禁用相应断点。enable + 断点编号:启用相应断点。l + 行号 :显示指定行之后的代码。d + 断点编号:删除相应断点。原创 2024-06-12 16:41:10 · 864 阅读 · 0 评论 -
【Linux】Linux环境基础开发工具_5
这个程序已经很完善了,但是我们发现,进度条后面的旋转光标是根据进度条相关的,比例发生变化,旋转光标才发生了变化,所以我们需要让后面的旋转光标与进度条不相关才行。这个进度条算是写完了,但没有结束,我们这个进度条完全就是一个单进程,不会依附于其他应用,这个进度条根本就没有意义,我们需要使其有意义才行。上篇我们实现了一个简易的进度条,不过那仅仅是测试,接下来我们真正的正式实现一个进度条。由于是国外的,访问比较困难)。文件就不需要了,我们只需要在。此时云端就有了我们上传的代码。光拷贝还不行,并没有上传。原创 2024-06-06 22:34:26 · 803 阅读 · 0 评论 -
【Linux】Linux环境基础开发工具_4
由于云服务器里面默认没有安装静态库,所以我们在使用静态库前需要手动安装一下静态库。其实已经跑完了,只是被缓冲区保存起来了,直到程序退出的时候才被刷新出来。:对库的依赖性比较强,一旦库丢失,所有使用这个库的程序都无法运行。以后修改Makefile的时候,只需要修改上面那部分变量就可以了。当然我们要做的是进度条而不是倒计时,我们这里还只是知识储备而已。makefile里面存的是不同文件之间的依赖关系个依赖方法。make 是一个命令,makefile 是一个文件。文件里的从上往下第一个目标文件,所以不需要写。原创 2024-06-03 17:30:54 · 670 阅读 · 0 评论 -
【Linux】Linux环境基础开发工具_3
静态库则可以让程序将自己需要的代码拷贝到自己的可执行程序中,跟其他程序无关。动态库被多个使用者所共享,一旦缺失,所有涉及到的程序都不可以运行了。C语言可以使用 gcc 或者 g++ 编译,更推荐使用 gcc。最简单的方法就是在注释开头和结尾输入。按 ESC 退出插入模式,此时选中的区域全都会插入 //按 hjkl 光标移动进行区域选择。知识点:如何让普通用户可以使用。C++只能使用 g++ 编译。后面如果不让保存,可以使用。按 d 就可以删除选中内容。hjkl 进行区域选择。输入 // 进行注释。原创 2024-05-31 22:44:14 · 748 阅读 · 0 评论 -
【Linux】Linux环境基础开发工具_2
按 X :可以向左侧删除(删除光标所在行的左侧字符)。按 p :可以将缓冲区的字符粘贴到光标所在的下一行。按 dd :删除光标所在行,剪切功能,可以使用粘贴。按 q 是没有用的,要按。按 h :将光标向左移动一格,相当于方向键的 ←。按 j :将光标向下移动一格,相当于方向键的 ↓。按 k :将光标向上移动一格,相当于方向键的 ↑。按 l :将光标向右移动一格,相当于方向键的 →。按 w :可以按单词在行内从左向右移动。按 b :可以按单词在行内从右向左移动。按 yy :将光标所在行复制到缓冲区。原创 2024-05-29 21:37:15 · 673 阅读 · 0 评论 -
【Linux】Linux的权限_2 + Linux环境基础开发工具_1
Linux不通过后缀识别文件类型,不代表Linux之上的工具(比如 gcc 编译工具)不通过后缀识别文件类型。但是如果新建了一个共享目录,两个 other 想在里面交流,所以这个共享目录的 other 必须具有 w 权限,但是这样容易被其他陌生人任意删除里面的文件,怎么办?yum是我们Linux预装的一个指令,可以搜索、下载、安装对应的软件,就相当于Linux的应用商店。文件属性的前十个字符里,后9个字符代表文件的访问者权限,而第一个字符则代表文件的类型。每个文件的创建,默认的权限是。原创 2024-05-28 23:04:18 · 1004 阅读 · 0 评论 -
【Linux】Linux的权限_1
shell位于用户和内核之间。将用户的命令翻译给内核处理,同时,将核心的处理结果翻译给用户。原创 2024-05-28 15:56:07 · 662 阅读 · 0 评论 -
【Linux】Linux的基本指令_3
是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。-j 显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)哦,由于我这里都是空文件,没什么好压缩的,所有都是压缩 0%。-r 递 归处理,将指定目录下的所有文件和子目录一并处理。可以显示所有带有已输入的部分的所有命令。-3 显示系统前一个月,当前月,下一个月的月历。命令顾名思义,就是查找的意思,可以查找文件。格式的文件解压,只需要把选项中的。原创 2024-05-27 21:47:25 · 761 阅读 · 0 评论 -
【Linux】Linux的基本指令_2
我们每次往文件内部写入就会清空文件,这也太扯了吧,要是我就是不想要清空文件呢?一样,给他什么字符串,他就输出什么字符串,默认输出到显示器(即我们所看到的界面)。-f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在。像Linux的显示器,也算是文件,echo 命令就是默认向显示器文件里写入。这个指令,不需要理解意思,只知道他为我们创建了一个1000行的大文件就行。(所有指令的目录位置) 目录下,使我们的可执行程序也成为指令,这就叫做。命令可以做到在同一个目录下将一个文件重命名。原创 2024-05-26 22:01:29 · 1142 阅读 · 0 评论 -
【Linux】Linux的基本指令_1
F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;答案是要的,因为磁盘不仅要存文件的内容,还要存储文件的名字,大小,类型等文件属性。所以文件不仅仅是由内容构成,即。命令,可以显示当前目录下的所有目录和文件(包括隐藏文件)。,即删除根目录下的所有文件或目录,系统会删除直到系统自己崩溃,这就是所说的。-d 将目录象文件一样显示,而不是显示其下的文件。命令去打印根目录下的所有目录和文件,你会发现目录和文件多的停不下来,按。-a 列出目录下的所有文件,包括以 . 开头的隐含文件。原创 2024-05-25 23:46:24 · 771 阅读 · 0 评论 -
【Linux】Linux的安装
我购买的阿里云是试用3个月,再做了一个什么题,免费续费3个月,后面送了一个300元折扣券,加了10块又续费4个月,相当于。云服务器也是可以多人共享的,一人购买云服务器还是困难的化可以跟别人拼一下,在Xshell里进行Linux编程时增加用户即可,如何增加用户本篇文章就不说了。当购买完成云服务器的时候,可以选择安装什么系统,我们选择 CentOs 7 为主版本的,7.6,7.7,7.8,7.9都可以。对于我们的学习来说,2核2G是绝对够用的,购买其他配置时,就找最低配置,也够用。我们需要另一款软件——原创 2024-05-24 23:11:44 · 770 阅读 · 0 评论