学习Linux系统编程入门(一)

一、文件和文件系统

文件是linux系统中最重要的抽象,大多数情况下你可以把linux系统中的任何东西都理解为文件,很多的交互操作其实都是通过文件的读写来实现的。

文件描述符

在linux内核中,文件是用一个整数来表示的,称为 文件描述符,通俗的来说,你可以理解它是文件的id(唯一标识符)。

普通文件

  • 普通文件就是字节流组织的数据
  • 文件并不是通过和文件名关联来实现的,而是通过关联索引节点来实现的,文件节点拥有文件系统为普通文件分配的唯一整数值(ino),并且存放着一些文件的相关元数据

目录与链接

  • 正常情况下文件是通过文件名来打开的
  • 目录是可读名称索引编号之间的映射名称和索引节点之间的配对称为链接
  • 可以把目录看做普通文件,只是它包含着文件名称到索引节点的映射(链接)

二、进程

进程是仅次于文件的抽象概念,简单的理解,进程就是正在执行的目标代码活动的正在运行程序。不过在复杂情况下,进程还会包含着各种各样的数据资源状态甚至虚拟计算机

这么理解进程:它是竞争计算机资源的基本单位。

进程、程序与线程

  • 程序

     程序,简单的来说就是存在磁盘上的二进制文件,是可以内核所执行的代码

  • 进程

   当一个用户启动一个程序,将会在内存中开启一块空间,这就创造了一个进程,一个进程包含一个独一无二的PID,和执行者的权限属性参数,以及程序所需代码与相关的资源。

     进程是系统分配资源的基本单位。

     一个进程可以衍生出其他的子进程,子进程的相关权限将会沿用父进程的相关权限。

  •  线程

     每个进程包含一个或多个线程,线程是进程内的活动单元,是负责执行代码和管理进程运行状态的抽象。

     线程是独立运行和调度的基本单位。  

进程的层次结构(父进程与子进程)

  在进程执行的过程中可能会衍生出其他的进程,称之为子进程子进程拥有一个指明其父进程PID的PPID。子进程可以继承父进程的环境变量和权限参数

  于是,linux系统中就诞生了进程的层次结构——进程树。

  进程树的根是第一个进程(init进程)。

过程调用的流程: fork & exec

  一个进程生成子进程的过程是,系统首先复制(fork)一份父进程,生成一个暂存进程,这个暂存进程和父进程的区别是pid不一样,而且拥有一个ppid,这时候系统再去执行(exec)这个暂存进程,让他加载实际要运行的程序,最终成为一个子进程的存在。

进程的结束

  当一个进程终止时,并不会立即从系统中删除,内核将在内存中保存该进程的部分内容,允许父进程查询其状态(这个被称为等待终止进程)。

  当父进程确定子进程已经终止,该子进程将会被彻底删除。

  但是如果一个子进程已经终止,但父进程却不知道它的状态,这个进程将会成为 僵尸进程

服务与进程

  简单的说服务(daemon)就是常驻内存的进程,通常服务会在开机时通过init.d中的一段脚本被启动

进程通信

  进程通信的几种基本方式:管道,信号量,消息队列,共享内存,快速用户控件互斥。

 

三、程序,进程和线程

程序(program)

程序是指编译过的、可执行的二进制代码,保存在储存介质上,不运行。

进程(process)

进程是指正在运行的程序。

进程包括了很多资源,拥有自己独立的内存空间。

线程

线程是进程内的活动单元。

包括自己的虚拟储存器如栈、进程状态如寄存器,以及指令指针

单线程的进程中,线程即进程。而在多线程的进程中,多个线程将会共享同一个内存地址空间

 

四、PID

在C语言中,PID是由数据类型pid_t来表示的。

运行一个进程

创建一个进程,在unix系统中被分为了两个流程:

  1. 程序载入内存并执行程序映像的操作:  exec
  2. 创建一个新进程: fork

 

 

 

  

posted @ 2018-01-15 14:14  心无引擎,眼无流派  阅读(108)  评论(0编辑  收藏  举报