学习Linux系统编程-Day(3)

一、文件I/O模型
1.Linux/UNIX系统I/O模型最为显著的特征之一是I/O通用性概念,也就是同一套系统调用( open()、 read()、 write()、 close()等)所执行的 I/O 操作,可施之于所有文件类型。所有类型的文件在内核的本质是一样的,都是字节流序列,可以使用lseek系统调用来随机访问。

2.Linux系统使用文件描述符(File Descriptor)来指代一个打开的文件,文件描述符一般是一个数值很小的非负整数。我们在Linux-c编程中使用open来打开文件的过程,实质上是建立并返回一个文件描述符的过程。如果使用shell启动一个进程,默认该进程会继承3个文件描述符,分别是:0->标准输入文件描述符1->标准输出文件描述符2->标准错误文件描述符。对于交互式shell而言,这三种文件都被重定向到终端,也就是输入输出和错误信息会直接在终端上打印,而对于c语言标准输入输出库stdio而言,这三者会被重定向到stdin、stdout和stderr上。

3.c语言标准输入输出库stdio建立在Linux I/O系统调用层之上。

二、程序
1.程序可以以源码形式二进制机器语言指令两种形式存在,前者为编程人员理解和阅读,后者为计算机执行而存在。程序要被计算机执行必须要经过编译称为二进制语言,与之不同的是脚本不需要这个过程,它可以由shell或其他命令解释器程序来直接处理和执行。

2.从标准输入读取数据,经过处理之后再输出的程序称为过滤器

三、进程
1.进程是正在执行的程序实例,是一个动态概念。

2.进程在内存中存放时,通常分为以下几个部分:
文本(代码)部分->存放程序执行的指令
数据部分->程序使用的静态变量
->程序运行时额外的动态内存分配来自此区域
->随函数调用、返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间

3.使用fork()系统调用来创建一个新的进程,新的进程叫子进程,调用fork系统调用的叫父进程。子进程共享父进程的文本代码段,而会继承父进程的数据段、堆段和栈段。这样一来子进程就可以在自己的空间中运行程序而不对父进程构成影响。一般而言子进程的创建有其特殊的任务,这时候一般使用execve()系统调用来加载一个新的程序,这会根据新的代码销毁并重建代码段、数据段、堆和栈。

4.首先明确这里提到的终止状态本质上是由进程生成的一个非负小整数。
有两种方法终止一个进程,第一是使用exit()系统调用来请求终止,第二是向进程传递信号来杀死进程。前者的终止状态由进程自己生成,后者的终止状态根据杀死进程的信号来设置。
所以一般提到的终止状态有两层含义,一是传递到exit()系统调用的参数,其二是杀死进程的信号。所以有时候为了区分,也把传递到exit()系统调用的参数称为进程的退出状态。最后,终止状态为0一般表示为正常退出,非0值则有错误发生。

5.进程都有一组与之相关的用户ID(UID)和组ID(GID),有以下的几种情况:
真实用户ID和组ID,这组ID是用来标识进程所属用户和组的,子进程的这些ID继承自父进程。
有效用户ID和组ID,它的本质是一种权限访问机制,用来和补充组ID一同确认对某些受保护资源的访问权限。一般情况下,有效ID和真实ID保持相同,但是我们可以通过改变有效ID来使进程获取某种访问权限。
补充组ID,用来标识进程所属的额外组,补充组ID通常继承自父进程。

6.特权进程指有效用户ID为0的进程,用户ID为0表示root用户,特权进程凌驾于内核权限限制之上,也就是说所有权限限制对于特权进程而言是透明的。由特权进程创建的进程也是特权进程,用set-user-ID机制也可以将一个进程的有效用户ID被置为所执行程序文件的用户ID,从而构造出一个特权进程。

7.就像6中所说的那样,特权进程拥有全部权限,事实上这些权限在Linux内部被划分为一组组相互独立的单元,每一组独立的权限单元被称为能力(Capabilities)。有了能力的概念之后,就可以选择性的赋予和收回一些权限,使得权限的授予更加灵活。

8.有两个不得不提的特殊进程,init进程和守护进程。init进程在系统引导时由内核创建,进程号总为1,总是以超级用户权限运行,而且它是“不灭”的,只有关闭系统才可以杀死它,它的职责是创建并监视系统运行所需的的一系列进程。守护进程也是拥有特殊用途的进程,也是引导时由内核启动直至系统关闭才结束,并且始终在后台运行

9.每个进程都会消耗资源(CPU、内存等),这个消耗资源的上限可以由系统编程者使用setrlimit()系统调用来人为设定。有两个指标与资源限制相关,软限制硬限制,软限制限定的是进程可以消耗的资源总量,硬限制则是软限制的调整上限,且硬限制只能调低不能调高。如果使用fork()来创建一个新的子进程,这个子进程将会继承父进程的资源限制。对于shell而言可以使用ulimit命令来限制shell的使用资源,执行ulimit命令的进程将会立即继承调整之后的资源限制方案。

猜你喜欢

转载自blog.csdn.net/zzy980511/article/details/113500902