高级Unix编程-基本概念

 

 

笔记

 

############################

 #Book名称:高级Unix编程

 #作者:Marc J. Rochkind

 #译者:王嘉祯 

#感悟:这本书写的很符合程序员的思维风格,清晰了我脑中的不少模糊的概念。

##########################

  第一章 基本概念

 

 1、Unix 文件种类

     常规文件、目录、符号链接、特殊文件、命名管道(FIFO)、和套接字(socket)。

1.1 常规文件

      1)Regular file 是包含以线性数组组织的数据字节。读写的开始字节位置由文件偏移量(file offset)确定,可设任何字节。

            不能在文件 中间插入或删除字节,作用到文件末尾。

            文件没有名称,只有被称为索引节号(i-number)的数字。一个索引节号是一批信息节点(i-node)的索引,这些信息节点存储在每个包含Unix文件系统的前部。

      2) 目录和符号链接

           由于使用索引节号标示文件不方便,所以引入目录来使用名称标示文件。

           每个目录包含一个两列表,一列是文件名称,另一列是对应的索引节号。名称/索引节点对被称为链接。目录和常规文件非常类似,也用一个信息节点并拥有数据。因此,在一个目录中,对应一个特定名称的信息节点也可以是另一个目录的信息节点。 

          每个进程都必须保存起当前目录的索引节号,以支持使用相对路径。

          内核为根目录保留了一个索引节号,这个在文件系统初次设立的时候就已建立。通过系统调用可以改变进程的根目录,如chroot。

          目录的两列结构直接由内核使用(内核关心文件内容的少量特例之一),所以程序不能像常规文件那样写目录,合法的仅仅包括链接的增加和删除。

           可以使用同一个索引节号来标示相同或者不同目录中的两个或者两个以上的链接,即文件可以拥有一个以上的名称。但是信息节点中包含链接计数,仅在链接计数为零是才被删除。 

           目录不存在多重链接。文件的多重链接也仅在同一文件系统中起作用,因为索引节号的唯一性仅限制在一个文件系统内部。为了避免这个后果可以使用符号链接(symbolic link),它将要链接的文件路径保存在一个真实文件的数据部分中。

  

3)特殊文件

      special file通常是指设备文件,分为两类:character special file 和 block special file。 块设备包含特定长度块的数组,并使用内核缓冲区来加速I/O操作。字符特殊文件不遵循规则,可以传输很小的块(字符),也可以传输很大的块(磁盘磁道),因此也不适合缓冲区缓存。

     同一个设备可以同时具有字符和块特殊文件,磁盘就是如此。内核中的文件系统代码通过一个块特殊文件访问常规文件和目录时,可以从缓冲区获益 。有时,尤其是高性能的应用程序需要进行更直接的访问。例如数据库管理器可以跳过文件系统,使用一个字符特殊文件访问磁盘(但不是文件系统使用的区域)。UNIX系统中的直接存储器访问(direct memory access, DMA),直接在进程的地址空间和磁盘间传输数据,进行存取。

     一个特殊文件有信息节点,但是磁盘上并没有任何指向该信息节点的数据字节。反而,在信息节点的那部分字节中包含了一个设备号(device number),他是一个列表的索引,指向设备驱动程序(device driver)的子程序集合。设备驱动程序在内核中运行。

 

4)程序、进程和线程

      程序(program)是指在磁盘常规文件中存储的指令(instruction)和数据(data)的集合。在它的信息节点中被标记为可执行的,文件的内容按照内核的规则来安排的(内核关注文件的又一个例子)。

     可执行文件:text file(source code) ----》(编译或者汇编程序完成)Object file ----------》(Linker链接她和一些库中的目标文件) ——》可执行文件。

      为运行一个程序,首先要请求内核产生一个进程,他是程序的运行环境,由三部分组成:指令段(instruction segment),User data segment, system data segment. 程序是用来初始化指令和用户数据的。现代程序员通常并不修改指令文件,但是修改数据。

      当进程运行时,内核记录那些对进程数据的相同部分进行读和写的线程。每一个线程都是一个单独的指令流(每一个线程都有自己的堆栈)。除非执行系统的特殊调用来创建其它线程,否则只能从一个线程开始。

      几个并发的进程可以有同一个程序初始化,不过不存在功能性的关系。而同一个进程的线程之间有很强的功能性关系。

      进程的System data包括诸如当前目录、打开的文件描述符等属性,进程必须通过多种系统调用方可对其进行访问和修改,因为SD处于进程的地址空间之外。

      由内核在当前运行的进程基础上产生的新进程,称之为原进程的child process,它继承了parent 进程的大多数系统属性数据。如父进程打开的文件。Thread之间是平等的,不存在继承关系。

5)信号

     内核可以向进程发送signal。信号可以由内核自身产生,从进程自身发送,从其他进程或以用户的名义发送(ctrl-C)。

     信号的类型约有28种。除了kill和stop信号外,进程对收到的其它信号,能控制响应行为。

6)Process-ID,进程组和会话

     每个进程都有自己的Process-ID,唯一,正整数。除了Init之外都有父进程。在进程的系统数据中保留其父进程ID。子进程的父进程先结束的话,孤儿会被初始进程接收。

     Unix内核允许将相关进程组织成process-group,进程组可以进一步组织成session。会话成员之一是session leader,进程组的成员之一是process-group leader.每一个进程都会记录其两个Leader的ID。 所以每个进程都会有四个相关的进程ID。

7)权限

     User-ID是和/etc/passwd文件中的login name相关联的一个正整数。用户登录后,login命令会将此ID作为已创建的第一个进程Login shell的用户ID,其它进程从shell继承这个ID

     用户组的组文件在/etc/group中定义。一个用户可能属于多个组的成员,所以进程也拥有一个补充组ID列表。

     这两个用户和组的登录ID被称为real user-ID,和real Group-ID,用于审计用户到用户的通信,表身份。还有effective user—ID和effective group-ID,用于决定权限。

      目录的“写”权限意味着使用系统调用来修改目录(增加和删除链接)的能力,“执行”权限意味着在路径中使用该目录的能力,有时称为“搜索”权限。对于特殊文件来说,读和写权限意味着执行读和写系统调用的能力,具体的含义取决于设备驱动程序的设计者。特殊文件的执行权限没有意义。

     可能需要用户暂时取得其它用户的特权。比如运行passwd命令改变口令,只有root才可以写入口令文件。可以这样实现:将passwd命令的所有者设为ROOT,让后打开passwd命令的信息节点中的另一个权限未成为设置用户ID(set-user-ID)位。运行打开此位的程序,会将进程的有效用户ID改变为包含该程序的文件的所有者的用户ID。

     如果不是超级用户,改变文件的所有者,会自动清除设置用户ID位,和设置组ID位。堵住漏洞。

8)进程的其它属性

    进程打开的每个文件都有一个打开的文件描述符(file descriptor)(从0到1000的整数),而进程产生的每个未命名管道都有两个打开文件描述符。子进程并不从父进程继承打开文件描述符,而是复制它们。但是,他们都索引只相同的全系统打开文件表。最有,父子进程共享相同的文件偏移。

     进程的优先级由内核调度程序使用,任何进程都可以通过系统调用nice来降低其优先级,通过相同的系统调用,超级用户进程可以提高其优先级(即,不用nice)。

9)进程间通信

    共享文件偏移量(shared file offset)、信号、process tracing、文件和管道。后来加入命名管道,信号量、文件锁,消息,共享存储器,网络套接字等。

      共享文件偏移量很少用于进程间的通信。利用进程跟踪,父进程可以控制子进程的运行,由于二者共享数据,所以可以自由通信,一般仅限于调试器使用。

      文件是进程间通信最常用的形式,但是最好不要并发使用。

      管道解决了文件的同步问题。如果读进程超过了写进程,读进程被阻塞;写进程远远超过了读进程,写进程被阻塞,直到读进程赶上来,不会有太多排队数据;一旦字节被读取,它将永远消失,长时间运行也不会填满文件系统。

      管道的缺点:1,通过管道通信的进程必须是相关的,典型的父子或者兄弟关系。太严格。2、当存在多个写入进程时,必须禁止使用,否则会相混合。3、会很慢,需要先将数据从写入用户进程写道复制到内核,在复制到读进程。

      命名管道,也称为FIFO,可以解决第一个缺点。命名管道作为特殊文件存在,任何具有权限的进程都能打开它进行读写。

      信号量是一个用于防止两个或两个以上的的进程同一时间访问同意资源的计数器。

       文件锁,特殊的信号量,防止两个以及跟多的进程访问文件的同一部分。

        消息:一种可以发送到消息队列的少量数据。任何拥有权限的进程都能从队列中接受消息。

        共享存储器,潜在地提供了最快的进程间通信。可以将同一存储器映射到两个或者两个以上的进程的地址空间中。可以用信号量和消息来同步读写进程。

        最好的一种方法是,使用一组称为套接字的系统调用的网络进程间通信。 

          

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值