linux中级编程
阿翔同学
这不是通往幼儿园的车车
展开
-
linux环境变成-进程同步【互斥量/文件锁】
前面已经介绍完了线程同步的方式,现在来介绍一下进程的同步方式一.mutex【互斥量】大家有一个错觉就是 以为 mutex只能用户线程间同步,其实不然mutex 其实可以用于进程间同步,在pthread_mutex_init之前,要修改他的 mutex属性就可以了mutex属性修改的函数主要有以下几个主要应用函数:pthread_mutexattr_t mattr类型:用于定义mutex,锁的【属性】初始化一个mutex.属性对象pthread_mutexattr_init函数:int.原创 2020-10-22 13:51:55 · 98 阅读 · 0 评论 -
linux环境变成-线程同步【信号量】
一.信号量进化版的互斥锁(1---->N)由于互斥锁的粒度比较大,如果我们希望多个线程间对某个对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能讲整个对象锁住,这样虽然保证了多个线程操作同一个共享资源数据的正确性,但同时也降低了 线程的并发程度。线程从并行执行变为串行执行,与直接用单进程操作该数据速度还要慢些,为什么呢? 因为锁 也是一种资源,上锁和 解锁 也是有开销的。信号量是一种相对折中的方式,即能保证同步,数据不紊乱,也能保证线程/进程的并发性二.信号量的主要应用函数.原创 2020-10-22 13:12:33 · 107 阅读 · 0 评论 -
linux环境编程-线程同步【条件变量-生产者消费者】
一.条件变量条件变量本身不是锁,但他可以造成线程阻塞,通常与互斥锁配合使用。给多线程提供一个会和场所二.条件变量主要应用函数int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *cond); int pthre.原创 2020-10-21 09:42:37 · 76 阅读 · 0 评论 -
linux环境编程-死锁
死锁【线程或者进程由于对锁的竞争让程序处于阻塞状态】1.线程【或进程】试图对同一个锁,试图加锁两次 2.线程1拥有 A锁,请求获得B锁, 线程2拥有B锁,试图获取A锁死锁如图1.线程【或进程】试图对同一个锁,试图加锁两次2.线程1拥有 A锁,请求获得B锁, 线程2拥有B锁,试图获取A锁避免死锁的方法:死锁1:判断lock返回值,如果成功访问完资源后立即解锁。死锁2:线程1调用trylock函数,尝试着获取锁2,如果失败,说明锁2在别的线程手中,...原创 2020-10-21 09:04:12 · 129 阅读 · 0 评论 -
linux环境编程-线程同步【读写锁】
一.读写锁与前面介绍的互斥锁类似,但读写锁有更高的并行性。二.读写锁的状态1.读锁【读模式下的锁】2.写锁【写模式下的锁】3.不加锁三.读写锁的特点1.读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞。 2.读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功;如果线程以写模式加锁会阻塞。 3.读写锁是“读模式加锁”时,既有试图以写模式加锁的线程,也有试图以读模式加锁的线程。那么读写锁会阻塞随后的读模式锁请求。优先满足写模式锁。读锁、写锁并行..原创 2020-10-21 08:48:51 · 87 阅读 · 0 评论 -
linux环境编程-线程同步【互斥锁】
一.同步概念在生活中,我们的同步往往都是同时起步,协调一致。但是不通的对象对“同步”的理解方式有稍许不同,如设备同步,指的是两个或者多个设备之间规定一个共同的时间参考;数据同步,操作的数据和数据库内容保存一致;文件同步指的是内存中的操作的数据和文件中的数据保持一致。而在编写代码中,通信中所说的同步与生活中大家说的同步有些差异,“同”表示协同,协助,互相配合。主旨在于协同步调,按预定的先后次序运行。二.线程同步线程同步说白就是 多个线程共同协调的 操作一个或者多个共享资源。因为线程是异..原创 2020-10-20 19:34:25 · 124 阅读 · 0 评论 -
linux环境编程-NPTL【了解】
在运行相同的线程有关的项目的时候如果家里电脑和公司电脑pthread版本不同,很有可能运行不起来NPTL1.查看当前的pthread库版本,getconf GNU_LIBPTHREAD_VERSION2.NPTL实现机制{POSIX}, Native POSIX Thread Library3.使用线程时候 指定 -lpthreadPOSIX Thread Library (NPTL)使Linux内核可以非常有效的运行使用POSIX线程标准写的程序。这里有一个测试数据,在32位...转载 2020-10-20 11:10:13 · 447 阅读 · 0 评论 -
linux环境编程-线程的属性
一.线程属性介绍--pthread_create第二个参数【pthread_attr_t数据结构,红色重点掌握】要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。typedef struct{int etachstate;//线程的分离状态 int schedpolicy;//线程调度策 略 struct sched_param schedparam;//线程的调度参数 int inheritsched;//线程的继承性 int scope...原创 2020-10-20 10:52:39 · 92 阅读 · 0 评论 -
linux环境编程-线程的相关函数
前面我详细的介绍了 线程和进程的区别【在linux下】,和线程的概念。现在我们来介绍一下线程的控制语句(人话就是操作线程的函数)1.pthread_ self 函数获取线程ID。其作用对应进程中getpid() 函数。pthread_ t pthread self(void);返回值:成功: 0;失败:无!线程ID: pthread t类型,本质:在Linux下为无符号整数(%lu),其他系统中可能是结构体实现线程ID是进程内部,识别标志。(两个进程间,线程ID允许相同)注意:不应使用全局变量p原创 2020-10-19 10:29:57 · 125 阅读 · 0 评论 -
linux环境编程-线程【后面还会介绍协程】
前面我们介绍了进程的相关操作,今天我开始给大家介绍线程【包括线程同步,进程同步都会在这一章介绍(后面介绍)】。一.线程概念什么是线程:线程是操作系统调度的最小单位【书上】,在linux环境中线程的本质是一种轻量级的进程,LWP【light weight process】,因此在linux中进程有PCB,线程也有PCB,但是线程没有独立的地址空间。线程【可以看成合租】,进程【可以看成独居】【如图】linux下:线程:最小的执行单位 进程:最小分配资源单位,可以看成只有一个线程的进程。.原创 2020-10-19 09:41:10 · 91 阅读 · 0 评论 -
linux环境编程-守护进程的实现
前面其实我们已经介绍过守护进程是什么东西啦,今天我们在啰嗦几句一.概念Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现; ftp 服务器; nfs 服务器等。创建守护进程,最关键的一步是调用setsid函数创建一个新的 Session【因为独立于终原创 2020-10-18 10:29:46 · 125 阅读 · 0 评论 -
linux环境编程-【进程组与会话】
一.先来看看进程组的概念与特性进程组,也称之为作业。BSD 于1980年前后向Unix中增加的一一个新特性。代表一个或多个进程的集合。每个进程都属于一个进程组。在waitpid函数和kill 函数的参数中都曾使用到。操作系统设计的进程组的概念,是为了简化对多个进程的管理。 当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID==第一个进程ID(组长进程)。所以,组长进程标识:其进程组ID==其进程ID【本人实测】 可以使用kill -SIGKILL -进程组ID(负的)来将整个进原创 2020-10-14 10:59:25 · 81 阅读 · 0 评论 -
【中断系统调用】和【网络终端】(了解)
一.系统调用分为两种:慢速系统调用和其他系统调用1.慢速系统调用: 可能会使进程永远阻塞的一类。如果在阻塞期间收到一个信号,该系统调用就被中断,不再继续执行(早期);也可以设定系统调用是否重启。如,read、 write、 pause、 wait..2.其他系统调用: getpid、 getppid、 fork..Read 1.读管道时候; 2.读IO设备输入(键盘之类的)的时候; 3.读网络的时候;都会阻塞进程。 慢速系统调用 都是 收到一个信号(必须是被捕捉的信号)就停止。.原创 2020-10-13 11:02:06 · 106 阅读 · 0 评论 -
linux环境编程-通过信号完成子进程回收
当子进程死翘翘的时候,会给父进程发出一个信号-----SIGCHLD,但是这个信号也不是仅仅由于子进程死亡而产生的先来看看SIGCHLD信号的长生条件子进程终止时【常常的发生】 子进程接收到SIGSTOP信号停止时 子进程处于停止状态,接收到SIGCONT后唤醒时前面的文章我们已经介绍了 waitpid函数 现在我们来用一用代码Demo【有问题的代码】#include <iostream>#include <signal.h>#include <e.原创 2020-10-12 10:47:11 · 258 阅读 · 0 评论 -
linux环境编程-可重入函数/不可重入函数
前面介绍了产生时序竞态的一种情况 和 怎么 解决这个情况的时序竞态,现在来介绍一下可重入/不可重入函数这个是比较概念的东西【大家了解即可{没有代码演示,哈哈哈,关注一波,点赞也行}】一.概念:一个函数在被调用执行期间(还没有执行完),由于某种时序或者被重复调用,称为重入。根据函数实现的方法可分为“重入函数”和“不可重入函数”来看看例子:【我给大家画个图,画的糙别怪我哦】先展示一下伪代码:【就那个意思 大家懂就行了】效果图:【这个 链表 是不是特别怪胎】结合上面的例.原创 2020-09-29 15:17:49 · 147 阅读 · 2 评论 -
linux环境编程-IPC【signal解决mysleep时序竞态】
前面 引出了 时序竞态产生的原因,现在我们来看看怎么解决 这个 问题其实非常的简单 这里 他不是说 自然时钟 发出的 SIGALRM时候 , 当前 进程 还处于 就绪状态嘛,在获取处理机之前,不能执行pause函数,那我们干脆 把这个 信号屏蔽掉【前面的文章讲了】,在调用 pause的时候在把 这个 信号 取消屏蔽,那这个信号不就会触发 pause函数嘛?,但是大家想一想 取消屏蔽这个操作 和 调用 pause 必须要是原子性的 【一次性执行完,没有进程的切换】,那么linux 也非常的贴心,给.原创 2020-09-29 14:23:07 · 114 阅读 · 1 评论 -
linux环境编程-IPC【信号(signal)时序竞态(竞态条件)】
前面我们介绍了信号的捕捉和屏蔽,今天我们介绍一下linux/UNIX中 由于信号产生的时序竞态(竞态条件)一.含义:时序竞态:即由于进程之间执行的顺序不同【CPU发生时钟中断,切换进程】,导致同一个进程多次运行后产生了不同结果的现象。二.首先我们先来介绍一个函数1) pause,在Windows编程中,我们肯定经常用到 system("pause"); 让进程处于阻塞状态,不过在linux中pause是一个系统调用,功能一样的也是用于阻塞进程的。windows中阻塞我们任意按一个键【本原创 2020-09-29 13:50:41 · 206 阅读 · 0 评论 -
linux环境编程-IPC【信号(signal)的捕捉】
前面我们介绍了怎么操作信号集,来阻塞某个信号,今天我们来看看另一种信号的处理方式捕捉原创 2020-09-28 13:41:50 · 135 阅读 · 0 评论 -
linux环境编程-IPC【signal-信号集操作函数】
前面我们介绍了能产生信号的函数,以及他们的传递信号给那些谁【非常的详细了】今天来介绍一下 信号集的操作函数。仔细看下面的视频,别眨眼,你会喜欢的。一.信号集操作函数内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在应用程序中自定义set来改变mask.已达到屏蔽指定信号的目的。【在前面我已经给大家介绍过啦,怎么影响的原理】信号集设定sigset _t set;// typedef unsigned long sigset .t; .int si原创 2020-09-27 14:20:44 · 138 阅读 · 0 评论 -
linux环境编程-产生信号函数的用法
前面我们介绍了 IPC中的信号机制(signal),今天来介绍 可以产生信号的函数用法一.killkill函数:给指定进程发送指定信号(不一定杀死) int kll(pid_ t pid, int sig);成功: 0;失败: -1(ID 非法,信号非法,普通用户杀init进程等权级问题),设置errno sig:不推荐直接使用数字,应使用宏名,因为不同操作系统信号编号可能不同,但名称一致。 pid>0:发送信 号给指定的进程。 pid=0:发送信号给 与调用kill函数进程属于原创 2020-09-26 14:11:03 · 215 阅读 · 0 评论 -
linux环境编程-IPC【signal信号机制】
前面我们介绍了 IPC的 两种,现在接收另一种 signal 【信号机制】,先来看个视频了解一下是我一.信号的概念我们先来通俗的介绍一下信号【方便大家更好的理解】,如:古代战争中的狼烟,信号弹;体育比赛中使用的信号枪.....他们的共性:1.简单,2.不携带大量的信息,3.满足某个特定的条件才放松。 信号是信息的载体,linux/UNIX环境下,古老,经典的通讯方式,现在依然是主要的通信手段。 Unix早期版本就提供了信号机制,但不可靠,信号可能丢失,Berkeley和AT&T都对原创 2020-09-24 14:04:45 · 208 阅读 · 0 评论 -
linux环境编程-IPC【共享内存-mmap(内存映射)】
前面我们介绍了什么是IPC,以及IPC中得管道,现在我们来介绍IPC得另一种方式mmap原理:将一个文件或者其它对象映射进内存。 1.使用普通文件提供的内存映射 【一般用于无血缘关系进程】2.【一般用于有血缘关系的进程】使用特殊文件提供匿名内存映射,【MAP_ANONYMOUS or MAP_ANON 在 UINX中是没有的但是呢 UNIX中也有 匿名映射的方式(linux中也可以这么用)就是用这两个文件/dev/zero, /dev/null(这两个稍后在匿名映射中...原创 2020-09-23 14:09:46 · 286 阅读 · 0 评论 -
linux环境编程-进程间通信(IPC)-管道
在介绍管道之前我们得先了解 什么 是进程间通信,先看一个 视频 缓解一下气氛一.概念:在linux环境下 每一个进程都有自己独立的地址空间,彼此之间相互独立,任何一个进程的全局变量在另一个进程中都看不到,所有进程之间不能相互访问,要交换数据必须通过内核(kernal),在内核中开辟一块缓冲区,进程1 把数据拷贝进内核空间,进程2把数据再从 内核空间读走,内核提供的这种机制就是所谓的 进程间通信(IPC)二.IPC的方式:【后面我都会逐一详细介绍原理和代码实现】进程间要完成数..原创 2020-09-22 10:18:48 · 135 阅读 · 0 评论 -
linux环境编程-waitpid(僵尸进程回收)
前面一篇文章介绍了 wait的 僵尸进程的回收,现在我们来介绍一下waitpid(与wait类似),那么这个函数 怎么使用呢原创 2020-09-21 10:34:17 · 516 阅读 · 0 评论 -
linux环境编程-wait(僵尸进程回收)
前面我们介绍了什么是僵尸进程,今天我们来看看 怎么回收 进程残留的PCB还是老规矩 看看视频 了解一下求关注#include<sys/types.h> #include<sys/wait.h> pid_t wait (int * status); wait()会暂时停止目前进程的执行,直到有信号来到或子进程结 束。如果在调用 wait()时子进程已经结束,则 wait()会立即返 回子进程结束状态值。子进程的结束状态值会由参数 status 返回, ..原创 2020-09-19 12:56:27 · 359 阅读 · 0 评论 -
linux环境编程-孤儿进程,僵尸进程,守护进程
前面的 进程控制我们已经陆续的介绍啦,今天介绍一下孤儿进程,僵尸进程,还有守护进程那他们到底是什么东西呢??先来个 视频了解一下博主的为人。一.孤儿进程父进程 先于 子进程结束,那子进程就成为了孤儿进程,父进程的资源被 init进程回收,没有结束的子进程就被init进程领养,init进程可以被看程是孤儿院的院长。二.僵尸进程:父进程 还在运行 ,子进程已经结束了【按常理来说,进程结束,他所开辟的资源都会被释放,当时这里 我要提醒大家,并不是所有的资源都会被释放的,内核中PCB(进程原创 2020-09-18 11:00:46 · 117 阅读 · 0 评论 -
linux环境编程-exec函数族
介绍一下 exec函数族,那exec函数族到底是什么呢? exec函数族里面 有那些成员呢?先看个视频了解一下看完视频之后,我们来具体的介绍一下这个exec函数族一.exec函数族fork创建子进程之后,子进程执行的是和父进程相同的代码,但可能是不同的代码分支,子进程往往也可以调用一种exec函数族的 一种来执行另一个程序。当进程 调用exec函数族中的一种时,该进程的用户空间代码和数据完全被新的程序替换掉。从新的程序的启动历程开始执行,调用exec并不是创建新进程【调用前 和 调用后原创 2020-09-17 16:46:12 · 89 阅读 · 0 评论 -
linux环境编程-文件描述符表
前面的文章我们以及介绍过PCB了,我们提及到了 一个文件描述符表,那他到底是长什么样子的呢?我们先来看个视频了解一下一.口述介绍其实通常我们看到的 int fd 并不是正真的文件描述符,可以理解成代号,或许是人们这样叫久了 就把 那个 int 的 fd 叫成文件描述符了。这个fd 和真正的文件描述符 是 一个 一对一映射的关系如上图fileno 函数把FILE*转成fd原来那个FILE*并没有关闭而是逆向映射到intfd把fdclose了...原创 2020-09-13 10:01:49 · 150 阅读 · 0 评论 -
linux环境编程-进程控制
前面文章我们介绍了PCB(进程控制块),进程和并发的概念,今天我们来介绍一下进程的控制原语(说白了就是怎么用进程)在介绍之前我们先来个视频了解一下博主:白嫖者vsup主好,和大家认识之后,我们来 详细的介绍一下一.fork函数(重点&基本)1)pid_t fork(void);这个函数我们重点来说一说, 创建进程失败return -1, 在父进程中成功创建子进程(return 子进程的进程,以便父进程后面好通过进程号,来操作子进程),在子进程中(创建成功return 0);.原创 2020-09-12 12:17:50 · 104 阅读 · 0 评论 -
linux环境编程-环境变量&打印环境变量
在shell编程主题中,我们已经大致的介绍过 环境变量和本地变量啦我们今天来具体的介绍介绍,那环境变量到底是什么呢?先来个视频了解一下 是谁是我一.环境变量含义&特征环境变量是指 操作系统中用来指定操作系统运行环境的一下参数1)特征:字符串 有统一的格式: 名=值[:值] 值用来描述进程的环境信息2)使用形式:与命令行参数类似3)存储形式:与命令行参数类似,char* []数组,数组名 environ, 内部存储字符串, NULL做为哨兵4)加载位..原创 2020-09-11 12:21:22 · 1721 阅读 · 0 评论 -
MMU的含义&作用
首先我们要先了解的MMU是什么呢? 它在哪里? 有什么用? 工作流程是什么呢?先来看个视频了解了解是我一.MMU是什么呢?内存管理单元(MMU)是您的工作部件,负责管理内存读/写。二.它在哪里?在中央处理器中三.有什么用?它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。四.工作流程是什么呢?我给大家画两张图上面这个图呢,我就解释一下 为...原创 2020-09-10 11:07:04 · 1986 阅读 · 0 评论 -
linux环境编程-进程&并发
首先我们得搞清楚,进程和程序有社么区别呢?一.进程和程序得区别1)程序【后面我们介绍介绍程序的编译过程和执行过程】:是编译好得二进制文件,在磁盘上得,不占用系统资源(cpu,内存,打开得文件,设备,锁......);2)进程: 进程本就是一个抽象得概念,与操作系统原理联系紧密,进程是一个活动得程序,占用系统资源,在内存中执行(程序运行起来就产生一个进程) 1.说到进程 就不得不说到 进程控制块(PCB),在OS中用代码的形式展示就是一个结构体。大家可以看到 这个 P...原创 2020-09-09 10:43:49 · 183 阅读 · 0 评论 -
linux中启动、内核相关的proc文件系统
前面我们已经介绍了linux的文件系统的组成,今天我们这里介绍一下具体的,proc文件系统。那proc文件系统到底是怎么样的呢?这些东西呢 在你linux系统环境编程的时候 很有用的,要看什么系统,或者进程的信息 都是可以去这里查的。一./proc是一个特殊的文件系统,该目录下文件用来表示与启动、内核相关的特殊信息1) /proc/cpuinfoCPU详细信息2) /proc/meminfo内存相关信息...原创 2020-09-07 19:34:53 · 169 阅读 · 0 评论 -
linux文件IO流程
我们现在 来聊一聊linux文件IO流程,前面介绍了 文件 IO,那么它具体的流程到底是什么样子的呢?一.首先我们先来介绍几个函数缓存同步 -为了保证磁盘系统与缓冲区中内容一致,Linux 系统提供了 sync、fsync 和fdatasync 三个 函数. 函数描述:向打开的文件写数据; 成功返回写入的字节数,若出错,返回-1。头文件:#include <unistd.h> int fsync(int fd); ...原创 2020-09-06 13:38:12 · 393 阅读 · 0 评论 -
linux文件直接/间接IO
话不多说直接上图错了 错了linux文件IO分为两种一.直接IO(直接去访问磁盘)这种方式(效率比较低,因为每次我们都是直接去访问磁盘,CPU和磁盘之间的读写速度差了几个数量级,降低了读取的效率,但是这种方式也并非一无是处,直接IO,不需要经过缓存区,如果在缓存还没有同步到物理磁盘的时候突然宕机【这个是有可能的】,那缓存中的数据就会丢失,既然你去看日志是写成功的,它这个成功仅仅是表示 你把数据从用户态写到内核态,写成功了,但并没有同步磁盘,宕机之后,内存清空,你写的东西就丢失了【所...原创 2020-09-06 13:03:17 · 384 阅读 · 0 评论 -
linux内核,用户态,系统调用
接下来我们来详细的介绍一下linux文件的IO细节废话不多说 先来一张图 看看错了 再来一.要想 了解文件IO的具体细节我们就要先了解什么是用户空间,什么是内核空间,什么是系统调用我们来看看图1)内核空间 - 存放的是整个内核代码和所有内核模块,以及内核所维护的数据。 2)用户空间 - 用户程序的代码和数据。3)系统调用 (一幅图就行了)我们在来文字叙述一下系统调用可被看成一个用户空间于内核空间交互的一个接口,好比一个信使,把进程的请求传给内核,...原创 2020-09-05 18:44:16 · 397 阅读 · 0 评论