初入Linux
草根学僧
意在记录自己的收获成果
展开
-
初识Linux-Linux文件和文件操作管理
1.什么是inode 首先我们要知道文件在硬盘上的最小存储单位叫扇区每个扇区储存512字节,操作系统不会一个一个扇区读取,效率太低了,而是一次读取多个扇区一次性读取姨”块“。块,一般是4KB,也就是8个扇区。 文件的数据都储存在块中,那么必然得一个地方储存文件的基本信息(元信息)。这种储存文件基本信息的区域叫做inode(索引节点)。 inode中包含 - 文件长度 - 文件按用户所有原创 2017-03-30 17:09:05 · 536 阅读 · 0 评论 -
进程控制-进程创建(fork、vfork)
现在我们有了进程的概念,我们就要开始创建进程了。 那么用户怎么在当前进程下创建新的进程呢? 系统提供三个系统调用fork()、vfork()、clone()。 系统调用fork()是建立进程的最基本操作,它是把Linux变换为多任务系统的基础。 1. fork() 头文件:usistd.h 声明:pid_t fork(void); 返回值:子进程中返回0,父进程中返回子进程ID,调用原创 2017-05-17 23:33:15 · 547 阅读 · 0 评论 -
IPC-引言
进程间通信就是不同进程之间进行信息传播和信息交换。但是,我们知道进程的进程空间是相互独立的,一般是不能互相访问的,唯一的例外是共享内存区。另外,系统空间是“公共场所”,各进程均可以访问,所以内核也可以提供这样的条件。此外,还有双方都可以访问的外设。进程间通信(Interprocess communication),简称IPC,是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行转载 2017-05-21 21:41:12 · 324 阅读 · 0 评论 -
IPC-管道(匿名管道)
管道(Pipe),也被叫做匿名管道,是UNIX系统IPC的最古老、最基本的机制,所以UNIX系统都提供此种通信机制。管道有两个局限性:最开始它是半双工的(即数据只能在一个方向上流动)。现在,某些系统提供全双工管道,但是为了可移植性,我们应该假定系统不支持全双工。管道只能在具有血缘关系的两进程之间使用(兄弟进程、父子进程之类具有公共祖先的进程)。管道是单向的、先进先出、无结构的字节流,它把一个进原创 2017-05-22 16:55:45 · 1083 阅读 · 0 评论 -
线程-线程同步
我们知道线程共享同一进程内的资源。如果每个线程使用的变量,其他线程都不会读取个修改,那么就不存在一致性问题。相同的,如果变量只读,多个线程同时读取该变量也不会存在一致性问题。但是,当一个线程可以修改变量,其他线程可以读取或修改变量,那么就要对这些线程进行同步,确保多个线程访问数据安全,不会访问到无效数据。 两个或多个线程同时修改同一变量时,也需要同步。跟前面信号讲的问题相同,考虑增量操作情况。增量原创 2017-06-18 19:10:46 · 1517 阅读 · 0 评论 -
IPC-消息队列
什么是消息队列? 消息队列是消息的链接表,储存在内核中,由消息队列标识符标识。每个数据块都被认为有一个类型。接受者进程接收的数据块可以有不同的类型值。消息队列的特点 消息队列不同于管道,消息队列是基于数据块的,而管道是基于字节流的,并且消息队列读取不一定要先入先出,可以根据数据类型读取。还有就是因为管道是随进程的,进程结束管道生命周期也就结束,而对于消息队列来说,是随内核的,就算进程退出,不去原创 2017-06-09 21:39:05 · 729 阅读 · 0 评论 -
最简单的生产者/消费者问题
生产者/消费者问题。可以从下图中看到,有一个容器用来存放数据,我们可以把这个容器当作”交易场所“或者”仓库“,生产者只关心仓库是否存满,不需要关心消费者的情况。消费者也一样,不需要关心具体生产者的情况,具体有多少个生产者,只需要知道仓库中是否有数据,双方甚至都不知道对方的存在。 生产者消费者,是在多线程同步的一个问题,两个固定大小缓冲区的线程,在实际运行是会发生问题,生产者是生成数据放入缓冲区原创 2017-06-22 16:18:56 · 629 阅读 · 0 评论 -
IPC-信号量
- 信号量信号量与之前的PIPE、FIFO以及消息队列不同。它是一个计数器,用于为多个进程提供对共享数据对象的访问。信号量在负责数据操作的互斥、同步等功能。学习信号量之前首先先来学习几个基本概念:互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。原创 2017-06-13 18:05:52 · 918 阅读 · 0 评论 -
IPC-共享内存
进程间通信的三大主题纤消息队列、信号量、共享内存,还剩下最后一个模块。下来我们就来看看这最后一个主题:共享内存。共享内存共享内存允许两个或多个进程共享一个给定的存储区。因为共享内存数据不需要在进程和进程之间复制,所以共享内存是最快的一种IPC。 允许两个或多个进程共享一个存储区的意思是,同一块物理内存被映射到这些进程各自的进程地址空间。这样这些进程都可以看到其他进程对共享内存中数据的更新。 另外原创 2017-06-14 15:48:18 · 817 阅读 · 0 评论 -
I/O复用-select
I/O复用I/O复用的功能就是同时监听多个文件描述符,这样的话程序性能就能得到大大提升。通常,网络程序在下列情况下需要使用I/O复用技术:服务端程序要同时处理多个socket。服务端程序要同时处理用户输入和网络连接。TCP服务器要同时处理监听socket和连接socket。服务器要同时处理TCP请求和UPD请求。服务器要同时监听多个端口,或者处理多种服务。 与多进程和多线程技术相比,I/原创 2017-06-29 16:34:11 · 745 阅读 · 0 评论 -
线程-线程控制
知道了线程与进程关系,下来来学习线程控制 下来将要学习的线程库函数是由POSIX标准定义的,称为POSIX thread或者pthread。在Linux 上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项。线程标识:prhread_self #include <pthread.h> pthread_t pthread_self(void);返回值:调用线原创 2017-06-15 18:28:32 · 912 阅读 · 0 评论 -
进程控制-进程程序替换(exec函数簇)
1.系统调用exec系列 exec功能:将一个新程序装入调用进程的内存空间,来改变调用进程的执行代码,从而形成新进程。 如果exec调用成功,当前进程将被覆盖,然后开始执行新程序,并且不会返回原进程,这样就产生了一个新进程,但是它的进程标识符与调用进程相同。这说明什么?说明exec并没有像fork()一样创建一个与调用进程并发执行的新进程,而是用新进程取代了原来的进程。所以,exec调用成功后,原创 2017-05-18 11:52:24 · 2717 阅读 · 0 评论 -
进程控制-进程终止(exit、_exit)
知道了进程怎么创建,接下来就来看看怎么终止一个进程终止函数exit()和_exit()。 函数 头文件 声明 exit stdlib.h void exit(int status) _exit unistd.h void _exit(int status)参数作用:可以利用这个参数传递进程退出状态。0表示正常退出,其他情况表示非正常结束。可以用wait接受来自子进原创 2017-05-18 18:32:59 · 4310 阅读 · 0 评论 -
初识Linux-Linux下的三个时间参数(atime、mtime、ctime)
Linux下三个时间的查看 Linux下用stat+failname获取时间参数 可以到其中有三个参数:Access、Modify、Change 三个参数的意义: 名称 简称 含义 查看命令 Access time atime 最后一次访问文件或目录时间 ls -lu filename Modify time mtime 最后一次修改文件或目录时间原创 2017-04-17 18:23:02 · 1026 阅读 · 0 评论 -
初识Linux-Linux下的文件查找(whereis、locate、which、find)
whereis 这个命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b),man说明文件(参数-m)和源代码文件(-s),如果活力参数,则返回所有信息。locate -这个命令的使用就很简单,直接在后面输入文件部分名称便可。 可以看到这里显示出了,所有文件名称中有passwd的都被显示出来。如果我们忘记文件完整名称时,这个命令是个好的选择。但是这个命令在使用上是有限制的,这源自它原创 2017-04-18 10:33:59 · 1318 阅读 · 0 评论 -
虚拟内存与物理内存
首先我们先来看一段代码 我们定义一个变量a并且初始化成0,下来我们fork()一个进程,在其中改变a的值,然后将变量a的值和地址打印出来。 看结果: 我们可以看到,子进程和父进程a的值不一样,但是地址却是一样的,这是怎么回事呢?相同的地址怎么可能存的值不一样呢?打印出不同的两个数a,这就说明操作系统中存了两个变量a,但是地址我们打印出来的地址是一个又是怎么回事呢?这就可以间接引出,虚拟原创 2017-04-19 10:31:33 · 1159 阅读 · 0 评论 -
初识Linux-链接文件
在Linux系统中,内核会为每个新创建的文件分配一个inode(索引结点)号,文件属性之类的都保存在inode中,在访问文件时,inode被复制到内存中从而实现对文件的快速访问。硬链接 硬链接是一个指针,指向文件inode,系统并不给它分配重新inode。 硬链接有两处限制: 1)不允许给目录创建硬链接 2)只有在同一个文件系统中的文件之间才能创建链接。 另外,对硬链接文件进行读写操作时原创 2017-03-30 20:24:04 · 572 阅读 · 0 评论 -
初识Linux-Linux文件类型
在Linux系统上除了一般文件外,所有目录、设备都是以文件的形式存在的。(Linux下“一切皆文件”) Linux文件啊类型常见的有:普通文件、目录文件、设备文件(字符设备文件和块设备文件)、管道文件和符号链接文件 1. 普通文件 用ls -lh或ll查看文件属性,可以看到例如“-rw-r–r–“的属性符号,其属性第一个”-“,这种文件在Linux下就普通文件。 2. 目录文件原创 2017-03-30 14:45:33 · 672 阅读 · 0 评论 -
IPC-命名管道(FIFO)
学习了匿名管道,我们知道它的一个不足之处就是没有名字,所以只能在两个相关进程之间使用,而且这两个相关进程要有一个公共祖先进程。那如果两个进程没有血缘关系,也想进行通信该怎么办呢?方法就是命名管道。 命名管道(FIFO):突破了匿名管道只能用于具有血缘关系间的进程通信,它可以使两个互不相干的进程彼此通信。提供了一个路径名与之相关联,以FIFO文件形式存储在文件系统中。与匿名管道相同是,命名管道原创 2017-05-25 10:41:56 · 1066 阅读 · 0 评论 -
进程-进程之进程状态(R、S、D、T、Z、X)
进程概念: 1)正在执行的程序 2)正在计算机上执行的程序实例 3)能分配处理器并由处理器执行的实体 进程的两个基本元素是程序代码和代码相关联的数据集。进程是一种动态描述,但并不代表所有的进程都在运行。这就可以引入‘进程状态’。 进程在内存中因策会略或调度需求, 会处于各种状态:Linux下的进程状态:static const char * const task_state_ar原创 2017-04-20 11:21:47 · 12614 阅读 · 0 评论 -
进程-进程基本概念
1.进程定义 进程是操作系统的核心和基础,所以多道程序操作系统,它们的创建都围绕着进程的概念。 进程的定义:正在执行的程序。正在计算机上执行的程序实例。能分配给处理器并由处理器执行的实体。2.进程分类 Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。交互进程——由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程——需要用户交互原创 2017-05-16 12:30:51 · 568 阅读 · 0 评论 -
进程-进程标识符
1.什么是进程标识符 系统给每个进程定义了一个唯一标识该进程的非负正数,称作进程标识符。当某一进程终止后,其标识符可以重新用作另一进程的标识符。不过,在任何时刻,一个标识符所代表的进程是唯一的。系统把标识符 0 和 1 保留给系统的两个重要进程。进程 0 是调度进程,它按一定的原则把处理机分配给进程使用。进程 1 是初始化进程,它是程序/sbin/init 的执行。进程 1 是 UNIX 系统那其原创 2017-05-17 19:15:02 · 7990 阅读 · 0 评论 -
进程控制-wait()和waitpid()函数
首先我们来看看调用wait()和waitpid()会发生什么。如果其所以子进程都还在运行,则阻塞。如果一个子进程已终止,正等待父进程获取其终止进程,则取得该子进程的终止状态立即返回。如果它没有任何子进程,则立即出错返回。 另外,要知道当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。而如果父进程由于接受到SIGCHLD信号而调用wait,我们期望wait会立即返回。如果在原创 2017-05-21 11:00:48 · 1034 阅读 · 0 评论 -
线程-线程基础
引言在前面讨论了进程,学习了Linux下进程概念、进程控制以及进程间通信。可以看到相关进程间可以存在一定的共享。 现在我们继续深入进程,了解如何使用多个线程在单进程环境中执行多个任务。进程中的所以线程都可以访问该进程的组成部分,如文件描述符和内存。 先来让我们来学习线程。为什么需要多线程?有些情况需要在一个进程中同时执行多个控制流程,这时候就需要线程了。 比如实现一个图形界面的下载软件,一方面原创 2017-06-15 14:50:45 · 739 阅读 · 0 评论