
Linux系统编程
文章平均质量分 85
操作系统
风吹雨淋
这个作者很懒,什么都没留下…
展开
-
Linux:读写锁
读写锁是一把锁,是互斥锁的升级版互斥锁没有说明是锁定读还是锁定写,读写锁有两个功能分别对读和写操作进行锁定锁的类型是pthread_rwlock_t读写锁会记录自己现在是锁定状态还是非锁定状态锁定状态下是读锁定还是写锁定。原创 2024-07-27 13:09:11 · 429 阅读 · 0 评论 -
Linux:线程池
线程池是生产者和消费者模型中的一部分,线程池主要维护一个任务队列和消费者线程,生产者通过线程池提供的API接口把任务放入任务队列,消费者线程通过循环不断取任务,线程池中的任务是数据的处理流程是一堆函数,所以任务队列中存的是函数的地址。任务队列,线程用来处理任务,线程不能立刻处理完任务就需要把任务存起来。工作线程:从线程池维护的任务队列里取任务,相当于消费者。工作线程需要从线程池的任务队列中取任务,所以需要参数。任务队列为空,消费者线程使用条件队列阻塞。管理者线程:用来管理工作线程,只有一个。原创 2024-07-25 23:21:47 · 583 阅读 · 0 评论 -
Linux:家目录&文件权限&vim使用
linux中,文件是以罗列出的第一个字符区分,不是以后缀名区分例:-rw-r–r--1 root root 6223 mar 19 10:01 0319.sql第一个 - 表示普通文件,后面的 - 是用户权限分隔符rw-r- -r- -,字符代表的是各用户对这个文件拥有的权限1表示链接数第一个root是当前文件所有者mar 19 10:01:修改时间0319.sql:文件名第一个 - 表示普通文件;6223:文件大小单位是字节后边是表示权限;m原创 2021-06-30 21:52:39 · 750 阅读 · 0 评论 -
线程安全队列代码
使用信号量完成线程安全队列#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#include <vector>#define THREAD_NUM 2class RingQueue{ public: RingQueue() :vec_(4) {原创 2021-10-17 15:19:34 · 174 阅读 · 0 评论 -
Linux:信号量 POSIX标准
信号量本质:资源计数器+PCB等待队列当多个线程想要获取信号量的时候,都会对信号量中的资源计数器进行-1操作保证互斥:初始化资源计数器为1,表示当前只有1个资源(意味着只有一个线程在同一时刻可以获取到信号量)线程A获取信号量时,资源计数器-1变成0,资源计数器的值>=0则表示可以访问临界资源;线程B访问,也会进行-1操作值就<0,就会被阻塞在信号量的等待接口中,线程B就会被放入PCB等待队列中保证同步:资源计数器不必刻意初始化为1资源计数器>0:表示还有多少资源可以原创 2021-10-16 23:08:32 · 182 阅读 · 0 评论 -
Linux:线程同步&条件变量(单生成者与消费者分析)
同步概念:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源;也就是说访问临界资源要按照一定的顺序进行;单个生成者消费者同步例子:吃面问题问题描述:val为碗,有面值=1,没有值=0;eat线程代表顾客吃面,对val进行- -;make代表厨师做面,对val进行++;正常的屏幕输入输出是0101,也就是顾客吃完厨师才能做面;一个线程不能在执行临界区途中,另一个线程也访问临界区;1.先以互斥的方式解决该问题,代码实现如下:直接给临界资源加锁,由运行结果原创 2021-09-17 12:17:09 · 249 阅读 · 0 评论 -
Linux:死锁与解决方法
死锁死锁:指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。死锁现象:现象1,如果执行流加锁完毕后,不进行解锁则会造成死锁(上篇所述);现象2,线程A获取了1锁,线程B获取了2锁,同时线程A还想获取2锁,线程B还想获取1锁现象2模拟:死锁的必要条件互斥:一个执行流获取互斥锁后,其它执行流不能再获取该锁;不可剥夺:A执行流拿着锁,其它执行流不能释放;循环等待:多个执行流拿着对方想要的锁,并且各执行流还去请求对方原创 2021-09-17 10:28:34 · 3711 阅读 · 0 评论 -
Linux:互斥锁(附线程调试)
互斥锁原理互斥锁:保证多个执行流在访问临界资源时,是原子操作互斥锁底层是一个互斥量,互斥量的本质是计数器,值保存在内存中,计数器值只能为1或为0;0:代表不能获取互斥锁1:代表可以获取互斥锁互斥锁是一个计数器,刚初始化出来的值是1,表示可以加锁线程获取互斥锁就相当于加锁过程,互斥锁计数器就从1变为0;其01的转化操作不是加减,而是将内存中计数器的值和寄存器中的值,靠一条汇编指令将两者里的值进行交换;程序计数器的值可为0为1,而寄存器的值必须初始化为0;只需要判断交换完毕之后,寄存原创 2021-09-16 23:02:16 · 651 阅读 · 0 评论 -
Linux:线程安全
线程安全线程不安全现象死锁信号量生产者与消费者模型线程池原创 2021-08-12 11:15:53 · 224 阅读 · 0 评论 -
Linux:线程控制(创建、终止、等待、分离)
线程控制线程创建创建函数两个线程有各自的栈线程安全死锁信号量生产者与消费者模型线程池原创 2021-08-10 21:49:34 · 674 阅读 · 1 评论 -
Linux:线程概念
线程概念线程控制线程创建、终止、分离、等待线程安全死锁信号量生产者与消费者模型线程池原创 2021-08-09 22:22:50 · 205 阅读 · 0 评论 -
Linux:信号(注册,注销,处理,阻塞)
信号的处理方式1.默认处理方式(称为SIGDFL):一个进程收到ctrl c信号而终止,说明2号信号在内核中有与之对应的处理动作,该处理动作为默认处理动作2.忽略处理方式(称为SIGIGN):SIGCHLD:子进程再退出时给父进程发送一个SIGCHLD信号,父进程对于该信号的处理方式是忽略处理;该信号对于所有进程而言都是忽略处理3.自定义处理(是想要更改信号的处理方式,需要用到两个函数)signal函数通过signal函数,把一个信号的处理方式改为了handler函数,当进程收原创 2021-08-09 17:19:18 · 2408 阅读 · 1 评论 -
Linux:进程信号
1.进程信号概念信号是一个软件中断解释:操作系统给当前进程发送一个信号,该信号不是立即就被进程处理,有一个处理标准,当前进程执行流进入内核执行内核代码时,再回到用户态前才会处理信号硬件中断mmu:由硬件直接发出的指令2.信号的种类操作系统定义的信号,共62个1.非可靠信号(非实时信号):1~31特点:不可靠,信号有可能会丢失2.可靠信号(实时信号):34~64特点:可靠,信号不会丢失3.信号的产生方式1.硬件产生ctrl c终止一个进程就是发送的2号信号4.信号的注原创 2021-08-08 16:54:03 · 290 阅读 · 1 评论 -
Linux:共享内存
共享内存的原理在物理内存中开辟一块空间;不同进程通过页表将该空间映射到字节的进程虚拟地址空间中;不同进程通过操作自己进程虚拟地址空间当中的虚拟地址,来操作共享内存;使用共享内存步骤:创建共享内存;附加,将进程附加该共享内存上(将进程虚拟地址和物理地址通过页表建设映射关系);分离,将虚拟地址和物理地址的映射关系从页表中删除共享内存映射到物理地址空间时 ,是映射在共享区中(在栈区和堆区中间)共享内存接口:1.创建或者获取共享内存key_t ftok(const char原创 2021-08-05 23:20:15 · 2910 阅读 · 3 评论 -
Linux:命名管道
命名管道:是有标识符的管道,其他进程可以通过管道标识符寻找到管道创建命令创建:mkfifo +文件名 → 创建一个管道文件,文件类型标识符是p,p代表管道文件管道文件:管道是一块内存,并不是进程操作文件往文件中去读写,管道文件作用就是标识内核中的buffer;或者说,不同进程就能通过管道文件内核中的管道用read函数操作管道文件和普通文件操作一样先进行读会阻塞(打开时就阻塞了),因为命名管道中没有数据;write函数一调用,立刻进行读操作函数创建:mkfifo:int mi原创 2021-08-05 23:19:06 · 1303 阅读 · 0 评论 -
Linux:匿名管道的非阻塞属性
如何将文件描述符设置为非阻塞:#include<fcntl.h>int fcntl(int fd, int cmd, …/*arg*/)fcntl函数有两个功能:查看属性设置非阻塞属性:O_NONBLOCK参数:fd:文件描述符cmd:告诉fcntl函数做什么事情,由两个宏去告诉arg:可变参数列表,在设置属性时要保留原属性F_GETFL获取一个文件描述符的权限,忽略arg参数F_SETFL设置一个文件描述符属性,在第三个参数中设置新属原创 2021-08-05 23:18:14 · 459 阅读 · 0 评论 -
Linux:匿名管道的阻塞属性
管道阻塞特性(10个):1.管道是半双工通信,数据流只能从写端流向读端ps aux | grep mypipeps aux命令通过写端往管道中写,grep通过读端进行读,数据流向是从写端到读端从PCB角度去理解管道:当前进程调用pipe函数,进程里有一个task_struct结构体;task_struct结构体中有一个struct files_struct* files的指针;该指针指向对应的结构体struct files_struct;在这个结构体中有一个fd_array的数组;数原创 2021-08-03 23:31:33 · 1185 阅读 · 1 评论 -
Linux:进程间通信之匿名管道&多进程编程
进程通信所做的事情:把a进程数据给b进程;ab进程通过各自页表关系将内存中某一块内存映射到各自的进程虚拟地址空间,更改物理内存区域没有用,要改页表的映射关系;进程虚拟地址空间本质上将进程分成了独立的进程,称为进程独立性;但是会造成进程与进程间相互协作困难进程间通信的本质:为了进程之间交换数据,使用的一种计数手段,进程有自己的进程虚拟地址空间,构成每一个进程的数据独立,每一个进程的数据独立会构成进程的独立性。这个特性有好有坏常见的进程间通信的方式:管道,共享内存,消息队列&原创 2021-08-03 23:24:09 · 260 阅读 · 1 评论 -
Linux:文件系统&软硬链接文件
软链接:通过ln -s命令生成软链接文件先创建一个普通文件,内容是hahaha给这个文件也创建一个软链接文件ln –s 1.txt 1.txtln 给1.txt文件创建一个软连接文件软链接文件(文件前为l),本质上是原文件创建的一个快捷方式,可以通过其操作原文件;特征:ll –i+文件,前面会有一串inode节点号inode本质上对应的是文件系统当中的概念,inode是描述文件在磁盘里的存储位置;文件在存储时不是连续存储,而是分成不同的block进行存储,inode节点描述了当原创 2021-08-03 15:15:24 · 2154 阅读 · 0 评论 -
Linux:静态库和动态库
静态库和动态库:都是程序代码的集合,将代码集合封装在库文件当中,提供给调用者使用(调用者会有库和相应库中的头文件)动态库特征:win平台后缀为 .dllLinux平台前缀为lib,后缀为 .so1.生成动态库:库代码://print.hvoid print();//print.c#include<stdio.h>#include "print.h"void print(){ printf("111");}使用gcc或g++命令,需要两原创 2021-08-03 11:42:56 · 1091 阅读 · 1 评论 -
Linux:文件描述符&重定向&缓冲区
文件描述符的本质:要从内核源码分析,进程运行起来后在内核中是一块task_strck结构体,接下来我们就要看一下这个结构体具体是什么样子的;这样做是为了获取文件描述符在task_struct结构体中如何定义的下图是task_struct结构体在内核中的源码在task_struct结构体中,用了一个结构体维护打开文件信息task_struct结构体中有一个struct files_struct* files的指针,该指针指向对应的结构体struct files_struct,在这个结构体中有一原创 2021-08-02 22:33:32 · 1633 阅读 · 0 评论 -
Linux:基础IO
C语言中的文件操作接口:fopen:FILE*fopen(const char* path, const char* mode)参数:path:待要打开的文件mode:打开方式r可读r+可读可写w可写w+若文件不存在则创建文件;若文件已存在则清空原文件a追加写,不能读;文件不存在则创建;文件存在则在末尾追加a+追加写,可以读……返回值:文件流指针成功返回文件流指针;失败返回空fread:size_t fread(void原创 2021-08-01 16:43:47 · 122 阅读 · 0 评论 -
Linux:进程程序替换(exec函数簇)
进程程序替换:替换正在运行的程序,让正在运行的进程执行新程序;进程程序替换原理及过程:一个可执行程序运行起乱来的时候一定是一个PCB或称为task_struct结构体,里面游艇变量叫内存指针,这个内存指针指向了进程虚拟地址空间,该空间包含栈区,堆区,数据段,代码段等程序;通过页表结构和物理内存映射,程序在运行起来后,代码段里就运行者我们自己写的代码;如果想让该程序替换成另一个程序,我们会在代码中调用进程替换函数;此时当前运行的程序会做一件事,那就是更新替换当前进程的代码段和数据段为新的程原创 2021-08-01 11:52:54 · 588 阅读 · 0 评论 -
Linux:进程等待wait函数&阻塞&coredump
进程等待:作用:父进程调用进程等待的方法,等待子进程退出,就能防止子进程变成僵尸进程;也就是说进程等待是父进程调用某个接口进行等待,父进程等待子进程退出回收子进程的资源,防止子进程变成僵尸进程进程等待的方法:1.wait函数:pid_t wait (int* status). 参数是一个指针类型,但是该指针类型并不是要传递一个指针参数,而是一个输出型参数;. 将wait函数内部计算的某个结果通过status变量返回给调用者;. 之前所接触的输出型参数有:swap函数中的参数,交换两数原创 2021-07-31 17:39:35 · 5105 阅读 · 1 评论 -
Linux:进程终止
1.进程退出场景:代码运行完毕,结果正确代码运行完毕,结果不正确代码异常终止2.进程常见退出方法:main函数returnctrl+c:退出前台进程exit和_exit函数接下来就来了解exit和_exit函数的区别exit函数:该函数是库函数,谁调用谁退出void exit (int ststus)status:进程退出的状态码_exit函数:该函数是系统调用函数,也是谁调用谁退出void _exit (int status)status:进程退出的状态码exit函数原创 2021-07-30 21:52:54 · 2355 阅读 · 0 评论 -
Linux:虚拟地址空间&写时拷贝
1.fork函数:见前面写的fork函数2. 写时拷贝:通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本图片来源比特教育当父进程创建子进程后,父子进程通过页表结构映射到同一块物理内存,当两个进程对物理内存区域的值都不修改的时候,它们各自的进程虚拟地址与物理内存的映射关系是一致没有改变的;当其中一个进程修改数据的时候,操作系统才会去修改这个进程的映射关系(属于深拷贝)fork函数在拷贝时也拷贝了页表关系,父子进程的全局变量值都在各自数原创 2021-07-30 15:38:58 · 354 阅读 · 0 评论 -
Linux:进程虚拟地址
进程虚拟地址空间:程序地址空间应称为 → 进程虚拟地址空间#与内存指针的关系:内存指针指向程序虚拟地址空间父进程创建子进程,并都去打印全局变量产生的问题:1.子进程创建成功后拷贝父进程的PCB,它们各自的内存指针(内存指针是PCB的一种资源)指向各自的进程虚拟地址空间,其中的代码段和父进程的一样。父子两进程是不同的进程打印出全局变量的地址一模一样;2.按照对内存的理解,不同进程使用内存应在不同的物理内存上,&符号拿到地址应该不同我们在C/C++代码中用&符号获得的地址,都是操作原创 2021-07-30 15:35:44 · 1520 阅读 · 0 评论 -
Linux环境变量
环境变量:告诉操作系统某些相关文件的存储位置,使操作系统运行更快hh环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性常见环境变量:PATH:指定可执行程序的搜索路径(在PATH环境变量中保存了命令所在的路径)也就是说将ls命令的程序内容保存到一个文件夹原创 2021-07-02 10:45:43 · 402 阅读 · 0 评论 -
Linux:fork函数&僵尸进程&孤儿进程
fork函数创建子进程:fork函数:pid_t fork (void),让进程在运行时调用fork创建一个新进程,该新进程称为子进程;fork函数没有参数fork函数有两种返回值创建失败返回值小于0创建成功返回值等于0,表示返回给子进程创建成功返回值大于0,表示返回给父进程,值为子进程的PID创建失败,返回值小于0创建成功,返回值等于0,表示返回给子进程返回值大于0,表示返回给父进程,该值为子进程的PID子进程拷贝父进程的PCB原理:父进程调用fork函数拷原创 2021-07-01 19:49:18 · 885 阅读 · 0 评论 -
Linux进程概念介绍
大多数计算机采用的是冯诺依曼体系结构中央处理器(CPU):运算器和控制器组成,进行算术运算&逻辑运算存储器:内存(不是磁盘)输入设备输出设备冯诺依曼两个重要思想:所有数据采用二进制存储:机器要通电数据都保存在存储器中(内存中),不用关心计算的过程网卡:计算机没有网卡不能访问互联网,既是输入设备,又是输出设备对操作系统需要了解的概念操作系统用于管理计算机中软硬件资源的软件操作系统由一堆代码组成操作系统=操作系统内核(操作系统的代码的总称)+一堆应用管理=描述(创建一原创 2021-07-01 15:33:37 · 232 阅读 · 0 评论 -
Linux常用指令介绍及总结
命令行参数:命令行参数本质是递交给ls程序的一个参数,该参数传递给main函数(linux下的每个命令都是一个可执行程序,所以该命令就有一个main函数)linux中,文件是以罗列出的第一个字符区分,不是以后缀名区分:d表示文件夹例:-rw-r–r--1 root root 6223 mar 19 10:01 0319.sql第一个-表示普通文件; 6223:文件大小单位是字节后边是表示权限; mar 19 10:01:修改时间1表示链接数;原创 2021-06-30 18:30:40 · 328 阅读 · 0 评论