
Linux系统编程
文章平均质量分 85
Linux系统编程等相关知识
袁百万
向梦想进发。热爱编程,永不放弃!
展开
-
Linux——进程间通信(管道)
管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”who程序运行成进程后,将数据输出到管道中,然后管道又将数据输入到wc进程中。函数原型pipe函数里面的这个参数是一个输出型参数,也就是当我们使用pipe函数的时候,可以得到fd[0]和fd[1]。这两个分别被称为读端和写端,匿名管道如同在生活中的天然气管道。只能从天然气公司到你家,是单向的。参数fd[2]是一个文件描述符数组。fd[0]为读端(为了便于记忆我们可以把0当做一个嘴巴)原创 2023-05-06 21:43:52 · 1506 阅读 · 2 评论 -
Linux——守护进程
不受用户登录、注销影响的进程称为守护进程。原创 2023-08-31 20:39:44 · 443 阅读 · 0 评论 -
Linux——线程池|单例模式|常见的锁|读写者问题
我们在生活当中,把一些东西预先存储起来。好比疫情的时候我们会预先存储一些菜和生活用品,都是一种池化技术的表现。原创 2023-06-02 10:11:36 · 411 阅读 · 0 评论 -
Linux——生产者消费者模型和信号量
为满的时候,生产和消费同时到来1、生产者无法到临界区来,因为它申请信号量无法成功2、生产者和消费者同时来的时候,一定能保证消费者先消费未来,生产和消费的位置我们要想清楚1.其实就是队列中的下标2.一定是两个下标(生产者一个下标,消费者一个下标,他们互不影响)3.为空或者为满,下标相同。原创 2023-05-30 17:19:25 · 1308 阅读 · 0 评论 -
Linux——线程的同步与互斥
可以把这个锁定义为全局的/静态的 -- 不用初始化和销毁直接定义为 :多个线程由并行执行变为了串行执行的,程序变慢了!锁只规定互斥访问,没有规定必须谁优先执行!锁就是真正的让多个执行流进行竞争的结果。该线程竞争能力强,其他线程则比较弱,因此每次都是该线程抢到了。是一种数据类型,我们可以使用这个类型来定义变量或者对象。原创 2023-05-26 17:50:06 · 957 阅读 · 0 评论 -
Linux——多线程(线程概念|进程与线程|线程控制)
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。原创 2023-05-23 18:32:01 · 744 阅读 · 0 评论 -
Linux——进程信号
信号其实就像我们日常生活中遇见的红绿灯一样。那么我们为什么能识别红绿灯?有人教育过我们——让你在大脑中记住了对应的红绿灯属性或者行为。比如:一个原始人来到十字路口他是不认识红绿灯的!(没有这种经历)。信号亦是如此,只有让进程提前“学习过”信号,他才知道当它接收到几号信号该做什么事情!信号到来我们必须立马去做吗?就像我们的外卖来了,但是现在云顶之弈地下魔盗团开出了200块两个妮蔻!我们肯定选择先梭哈,而不是去拿外卖。这就体现了信号的异步,当前进程可能正在处理更重要的信号所以现在给它发其他信号它不会去做。原创 2023-05-13 20:49:28 · 688 阅读 · 0 评论 -
Linux——进程间通信(System V共享内存)
我们申请共享内存的时候也会申请一个数据结构对象,操作系统需要将共享内存管理起来,本质管理的就是共享对应的特定数据结构对象形成的数据结构进行操作的。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。我们在使用malloc(1024)在堆空间开辟空间的时候,只需要在free(p)中传入一个地址就可以准确的对我们开辟的空间进行释放,并不用传入我们需要开辟空间的大小。对应共享内存空间(进程地址空间里面的)的起始地址。原创 2023-05-09 09:13:35 · 563 阅读 · 2 评论 -
Linux——理解文件系统和动静态库
Linux中的文件分为文件属性和文件内容。文件属性又称为元信息。保存在inode结构中,inode是一个文件属性的集合。一个文件名都对应着一个inode。我们使用 ls -i,就可以查看当前目录下文件的inode编号我们之前在讨论进程与文件的关系的时候,讨论的都是进程与被打开文件的关系。那么没有被打开的文件存放在哪里呢?答案是存放在磁盘上!原创 2023-05-04 21:46:48 · 526 阅读 · 3 评论 -
Linux——基础IO
会使用全缓冲来进行缓冲区的刷新,全缓冲:等缓冲区满或者关闭fd的时候会刷新缓冲区,然而父子进程会先后退出,然后就把我们文件的内容多拷贝了一份,先后退出进行缓冲区的刷新,造成了打印两份的操作。我们之前讲过,CPU的计算速度(纳秒级别)是极快的,然而磁盘的读取速度(毫秒级别)相对于CPU来说非常慢,如果CPU什么都不干把时间都浪费到去等磁盘将数据读取到内存中,那岂不是效率极低,因此就引入了缓冲区的概念,在内核空间里面有一块内核缓冲区,可供我们的磁盘将数据加载到内存的时候先存放到内核缓冲区中,等CPU来使用。原创 2023-05-02 17:14:27 · 818 阅读 · 16 评论 -
冯·诺依曼体系结构与初始操作系统
根据冯诺依曼体系结构图我们也发现,CPU只和存储器(内存)打交道,这也解答了我们一个问题。为什么程序运行之前必须加载的内存,因为可执行程序是在硬盘上的,然而CPU只能从内存中获取数据,所以必须先将硬盘上的数据加载到内存,也就是程序加载到内存上。原创 2023-04-26 16:08:37 · 478 阅读 · 1 评论 -
Linux——进度条与git的使用
在Makefile中,直接使用 gcc -o ProcessOn main.c process.c 可以使用两个.c文件生成一个可执行文件。后面的 -DN=2是一个对N的给定值以便于修改我们想使用怎样的符号进行进度条的打印。查看这个仓库提交的日志信息,记录了你在该仓库上的任何提交操作。它可以将光标移动到当前行的行首,然后进行覆盖打印。将.git仓库中新增文件上传到gitee。进行了函数的声明和头文件和宏定义的包含。将克隆仓库的新增文件添加到暂存区。将暂存区文件添加至.git仓库中。原创 2023-04-25 18:05:15 · 865 阅读 · 1 评论 -
Linux进程控制(含进程程序替换)
在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。fork的返回值:子进程中返回0,父进程返回子进程pid,出错返回-1我们可以发现,Before输出了一次,但是调用fork()函数之后After输出了两次,也就是说调用fork()之后父子两个执行流分别执行。原创 2022-11-06 22:43:56 · 689 阅读 · 1 评论 -
Linux——环境变量与地址空间
之前说‘程序的地址空间’是不准确的,准确的应该说成进程虚拟地址空间 ,每个进程都会有自己的地址空间,认为自己独占物理内存。其实不然,他们也需要,但是他们的路径已经在环境变量PATH中了,也就是说当我们执行它们的时候,系统会去查看环境变量,然后默认从环境变量的路径中从左到右的各个路径下以此访问,所以只要这些指令的路径位于PATH的某个路径下,就可以不用加./了。将我们的可执行程序拷贝到环境变量PATH的某一路径下,这个方法我们不做演示,因为这样的或容易破坏我们本来的环境变量,不建议使用。为什么要有地址空间?原创 2022-11-04 16:21:20 · 1093 阅读 · 0 评论 -
Linux进程概念
当一个进程的退出信息被读取后,该进程所申请的资源就会立即被释放,该进程也就不存在了,所以你不会在任务列表当中看到死亡状态。是父进程退出了,然而子进程未退出导致的,当父进程被杀死后,子进程还会被1号进程(系统进程)所领养。当我们需要查看pid为11571的进程信息,你需要查看/proc/11571这个文件夹。我们可以发现,当我们杀死子进程而保留父进程时状态会变为Z,即为僵尸状态。+号的意思是在前台运行,当我们运行时加上&就可以进行后台运行。僵尸进程是由于父进程未退出子进程先行退出,然而孤儿进程则相反。原创 2022-10-26 20:04:02 · 1114 阅读 · 4 评论 -
Linux项目自动化构建工具-make/Makefile
创建一个Makefile: 在命令行直接输入make和make clean可以直接调用相关的指令。 我们还可以用通配符进行简写。 在命令行直接输入make和make clean可以直接调用相关的指令。原创 2022-10-13 07:21:05 · 389 阅读 · 2 评论 -
Linux——gcc/g++和gdb的基本使用
我们上述是利用Linus把我们在C语言阶段就熟知的四个阶段给展开进行处理和理解,那么如果我们每次不加-o选项那么默认生成a.out文件。并且我们可以对这几个过程的任何一个过程直接进行:gcc 文件名 -o test就可以直接生成 可执行文件,也就是不加任何的选项。程序的发布方式有两种,debug模式和release模式Linux gcc/g++出来的二进制程序,默认是release模式要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项调试前的准备gdb 文件名进入调试。原创 2022-10-12 20:12:50 · 2066 阅读 · 8 评论 -
Linux——vim/vi文本编辑器
i 进入插入模式,也是我们以后用的最频繁的模式。: 进入低行模式,在该模式可退出vim。默认模式,Esc可以回退到命令模式。:为强制保存和强制退出。原创 2022-10-11 19:37:54 · 1921 阅读 · 2 评论 -
Linux软件包管理器——yum
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.原创 2022-10-11 18:39:30 · 704 阅读 · 3 评论 -
国庆弯道超车之~~~Linux——权限管理
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask。说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。换句话来讲, 就是只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限.这些权限的限制只对普通用户有用,对于超级用户root来说这些限制并不起作用。如果目录本身对other具有w权限,other可以删掉任何的目录下的文件。功能:修改文件或目录的所属组。原创 2022-10-06 15:58:43 · 197 阅读 · 6 评论 -
室友还沉浸在原神二周年——我已经把Linux基本指令给总结好了
cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录中。head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的 开头至标准输出中,而 tail 想当然尔就是看档案的结尾。mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命 令,经常用来备份文件或者目录。选项: -n 显示的行数。原创 2022-09-29 21:02:05 · 1289 阅读 · 5 评论