Linux应用编程
良许Linux
公众号:良许Linux
展开
-
Linux应用编程 | 环境变量相关
环境变量环境变量,是指在操作系统中用来指定操作系统运行环境的一些参数。比如说,用户登录到系统后,他的家目录是什么?默认文本编辑器是什么?默认shell程序是什么?类似这样的信息就称为环境变量。环境变量通常具备以下特征:① 以字符串形式存储; ② 以健值对格式存储:健=值[:值] (同一个健有多个值的话,值与值之间以:相隔)③ 值用来描述进程环境信息。存储形式:char *[]数...原创 2018-05-01 17:13:46 · 419 阅读 · 0 评论 -
Linux系统编程 | 时序竞态
Linux系统编程 | 时序竞态时序竞态什么是时序竞态?将同一个程序执行两次,正常情况下,前后两次执行得到的结果应该是一样的。但由于系统资源竞争的原因,前后两次执行的结果有可能得到不一样的结果,这个现象就是时序竞态。pause函数函数原型:int pause(void);函数作用:进程调用pause函数时,会造成进程主动挂起(处于阻塞状态,并主动放弃CPU),并且等待信...原创 2018-11-26 20:14:25 · 389 阅读 · 0 评论 -
Linux系统编程 | 信号捕捉
前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式:默认处理方式; 忽略; 捕捉。信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作。下面详细介绍两个信号捕捉操作参数:signal和sigaction。signal函数函数原型:sighandler_t signal(int signum, sighandler_t handler)...原创 2018-11-27 20:47:52 · 318 阅读 · 0 评论 -
Linux系统编程 | 线程原语(1)
pthread_create函数函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void (start_routine) (void *), void *arg);函数作用:创建一个新线程。 其作用对应于进程中的fork()函数;返回值:成功:0;失败:错误号;函数参数:t...原创 2018-11-28 19:43:53 · 336 阅读 · 0 评论 -
Linux系统编程 | 线程原语(2)
pthread_join函数函数原型:int pthread_join(pthread_t thread, void **retval);函数返回值:成功:0;失败:错误号函数作用:阻塞等待指定线程退出,并获取线程退出状态。其作用,对应进程中的waitpid() 函数。函数参数:thread:等待的线程ID;retval:存储线程结束状态。由于pthread_e...原创 2018-11-29 19:44:16 · 265 阅读 · 0 评论 -
Linux系统编程 | 线程属性
在之前的章节中,我们在调用pthread_create函数创建线程时,第二个参数(即线程属性)都是设为NULL,即使用默认属性。一般情况下,使用默认属性已经可以解决我们开发过程中的大多数问题。但是,有时项目中我们对线程会有些特殊的要求,比如修改线程栈的大小,直接调用线程的库函数无法满足需求,在这种情况下我们可以直接对线程属性进行设置。类型pthread_attr_t是一个结构体,主要包括如...原创 2018-11-29 19:45:28 · 289 阅读 · 0 评论 -
Linux系统编程 | 线程同步概念
同步概念同步,指对在一个系统中所发生的事件之间进行协调,在时间上出现一致性与统一化的现象。但是,对于不同行业,对于同步的理解略有不同。比如:设备同步,是指在两个设备之间规定一个共同的时间参考;数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致;文件同步,是指让两个或多个文件夹里的文件保持一致,等等。但是,在软件编程或者通信行业中所说的同步与生活中大家印象中的同步概念...原创 2018-11-25 21:53:48 · 275 阅读 · 0 评论 -
Linux系统编程 | 互斥量mutex
互斥量mutex前文提到,系统中如果存在资源共享,线程间存在竞争,并且没有合理的同步机制的话,会出现数据混乱的现象。为了实现同步机制,Linux中提供了多种方式,其中一种方式为互斥锁mutex(也称之为互斥量)。互斥量的具体实现方式为:每个线程在对共享资源操作前都尝试先加锁,成功加锁后才可以对共享资源进行读写操作,操作结束后解锁。互斥量不是为了消除竞争,实际上,资源还是共享的,线程间也...原创 2018-11-30 23:12:40 · 363 阅读 · 0 评论 -
Linux系统编程 | 读写锁rwlock
读写锁是另一种实现线程间同步的方式。与互斥量类似,但读写锁将操作分为读、写两种方式,可以多个线程同时占用读模式的读写锁,这样使得读写锁具有更高的并行性。读写锁的特性为:写独占,读共享;写锁优先级高。对于读写锁,掌握了这12个字就足矣了。Linux环境下,读写锁具有以下三种状态:读模式下加锁状态 (读锁) 写模式下加锁状态 (写锁) 不加锁状态虽然读写锁有读锁、写锁、不加锁三种状态...原创 2018-12-01 20:02:39 · 3015 阅读 · 1 评论 -
Linux系统编程 | 条件变量
条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,所以互斥锁和条件变量通常一起使用。当条件满足的时候,线程通常解锁并等待该条件发生变化,一旦另一个线程修改了环境变量,就会通知相应的环境变量唤醒一个或者多个被...原创 2018-12-02 10:58:18 · 1254 阅读 · 0 评论 -
Linux系统编程 | 信号量
大家知道,互斥锁可以用于线程间同步,但是,每次只能有一个线程抢到互斥锁,这样限制了程序的并发行。如果我们希望允许多个线程同时访问同一个资源,那么使用互斥锁是没有办法实现的,只能互斥锁会将整个共享资源锁住,只允许一个线程访问。这种现象,使得线程依次轮流运行,也就是线程从并行执行变成了串行执行,这样与直接使用单进程无异。于是,Linux系统提出了信号量的概念。这是一种相对比较折中的处理方式,它...原创 2018-12-03 21:29:16 · 528 阅读 · 0 评论 -
Linux系统编程 | 信号入门
信号的概念在我们的生活中,信号随处可见。比如,田径比赛中的发令枪,就是给运动员发出起跑的信号;交通路口的红绿灯,就是给我们发出允许通过或禁止通过的信号。这些信号都有共同的特点: 简单; 携带少量信息; 满足特定条件才发送。 信号是信息的载体,在Unix/Linux环境下,是一种古老、经典的通信方式,对于现代Unix/Linux来说,依然是非常重要的IPC(进...原创 2018-11-22 19:22:23 · 283 阅读 · 0 评论 -
Linux系统编程 | 共享内存之mmap
共享内存概念共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备。但是它没有自带同步机制,需要配合信号量等方式来进行同步。共享内存被创建以后,同一块物理内存被映射到了多个进程地址空间,当有一个进程修改了共享内存的数据,其余的进程均可看见所修改的内容,反之亦然。mmap函数函数原型:void *mmap(void *adrr, size_t le...原创 2018-11-21 20:26:06 · 397 阅读 · 0 评论 -
Linux应用编程 | 进程控制与进程共享
进程控制fork函数函数说明:创建一个子进程。函数原型:pid_t fork(void);返回值:失败返回-1;成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0pid_t类型表示进程ID,但为了表示-1,它是有符号整型。(0不是有效进程ID,init最小,为1)注意返回值,不是fork函数能返回两个值,而是fork后,父子进程需【各自】返回一个。循...原创 2018-05-01 21:55:40 · 332 阅读 · 0 评论 -
Linux应用编程 | exec函数族
fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。将当前进程的.text、.data替换为所要加载的程序的.text、.data,然后让进程从新的...原创 2018-05-02 22:31:18 · 10417 阅读 · 1 评论 -
Linux应用编程 | 孤儿进程及僵尸进程
孤儿进程在Linux/Unix环境中,我们是通过fork函数来创建子进程的。创建完毕之后,父子进程独立运行,父进程无法预知子进程什么时候结束。通常情况下,子进程退出后,父进程会使用wait或waitpid函数进行回收子进程的资源,并获得子进程的终止状态。但是,如果父进程先于子进程结束,则子进程成为孤儿进程。孤儿进程将被init进程(进程号为1)领养,并由init进程对孤儿进程完成状态收集工...原创 2018-05-04 22:26:45 · 4878 阅读 · 0 评论 -
Linux应用编程 | wait及waitpid
wait函数一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在Shell中用特殊变量$?查看,因为Shell是它的父进程,当它终止时S...原创 2018-05-05 10:57:24 · 478 阅读 · 0 评论 -
Linux应用编程 | 进程相关概念
程序和进程 程序,是一种静态的概率,是指编译好的二进制文件,在磁盘上,不占用系统资源(包括但不限于:cpu、内存、打开的文件、设备、锁)。所以,程序只是磁盘上的一个文件而已。进程,是一种动态的概念,也是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。运行时,程序会被加载到内存中执行,产生一个进程。可以这样理解:程序是一个蓝图,告诉你房子如何建造,而进程就...原创 2018-04-27 22:43:21 · 338 阅读 · 0 评论 -
Linux系统编程 | 线程概念
什么是线程在早期,unix其实是没有线程的概念,因为它的进程已经做的足够优秀了。但是,随着操作系统行业的发展,其他操作系统,比如windows,都有了线程的存在。于是,很多开发人员就呼吁unix也提供线程功能。unix为了顺应开发人员的呼吁,于是也开发出线程。但对于Unix/linux而言,线程不是一个全新的东西,而是直接拿进程过来改改,将进程改头换面,就变成了线程。其本质依然是进程。...原创 2018-11-25 19:43:25 · 274 阅读 · 0 评论 -
Linux系统编程 | 信号集操作函数
先来回顾一下未决信号集是怎么回事。信号从产生到抵达目的地,叫作信号递达。而信号从产生到递达的中间状态,叫作信号的未决状态。产生未决状态的原因有可能是信号受到阻塞了,也就是信号屏蔽字(或称阻塞信号集,mask)对应位被置1。阻塞信号集和未决信号集均是由内核维护的,整个过程如下图示:img我们有时需要屏蔽某个信号,就需要去修改阻塞信号集。那么,我们该如何修改阻塞信号集?系统提供的一个方...原创 2018-11-23 22:11:32 · 312 阅读 · 0 评论 -
Linux系统编程 | 进程间通信概述
1. 进程间通信的概念我们知道,在linux环境下,进程与进程之间是相互独立的,每个进程各自都有不同的用户地址空间。一般而言,进程间的进程空间是不能相互访问的。但在很多情况下,进程与进程之间是需要进程相互通信的,一起来完成某项特定的功能需求。在linux环境下,进程间通信(Inter Process Communication,IPC)是通过内核来完成的。2. 进程间通信的应用场景...原创 2018-11-18 12:24:51 · 300 阅读 · 0 评论 -
Linux系统编程 | 信号的产生
终端按键产生信号ctrl + c发送2号信号SIGINT,将中止当前进程。SIGINT的“INT”是interrupt的意思;ctrl + z发送20号信号SIGTSTP,暂停/停止当前进程。SIGTSTP中的“T”是terminal的意思。进程收到此信号后,将由当前转入后台,可用ps aux找到它。比如说,我们使用vim编写代码时,需要在vim以外处理一些事情,但又不想退出v...原创 2018-11-19 19:47:37 · 456 阅读 · 0 评论 -
Linux系统编程 | 管道
▋1. 管道的概念管道,又名「无名管理」,或「匿名管道」,管道是一种非常基本,也是使用非常频繁的IPC方式。1.1 管道本质管道的本质也是一种文件,不过是伪文件,实际上是一块内核缓冲区,大小4K; 管道创建以后会产生两个文件描述符,一个是读端,另一个是写端; 管道里的数据只能从写端被写入,从读端被读出;1.2 管道原理管道是内核的一块缓冲区,更具体一些,是一个环形队列。数据从...原创 2018-11-20 22:40:33 · 365 阅读 · 0 评论 -
良许Linux | Linux下如何查看硬件信息?
我们在 Linux 下进行开发时,有时也需要知道当前的硬件信息,比如:CPU几核?使用情况?内存大小及使用情况?USB设备是否被识别?等等类似此类问题。下面良许介绍一些常用的硬件查看命令。lshwalshw 这个命令是一个比较通用的工具,它可以详细的列出本机的硬件信息。但这个命令并非所有的发行版都有,比如 Fedora 就默认没有,a需要自己安装。lshw 可以从各个 /proc 文件...原创 2019-05-16 17:07:37 · 462 阅读 · 0 评论