UNIX体系结构:

  从严格意义上讲,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(Kernel),因为他相对较小,而且位于环境的核心。图片显示了UNIX系统的体系结构。

  内核的接口被称为系统调用(system call)。公用函数库构建在系统调用接口只是,应用程序即可使用公用函数库,也可以使用系统调用。shell是一个特殊的应用程序,为运行其他应用程序提供一个接口。

登录:

  系统口令文件通常是/etc/passwd。口令文件中的登录项由7个以冒号分隔的字段组成,依次是:登录名、加密口令、数字用户ID、注释字段、起始目录(/home/sar)以及shell程序(/bin/ksh)。

  目前,所有的系统已将加密口令移到另一个文件中。
shell:

  shell是一个命令行解释器,它读取用户输入,然后执行命令。

文件和目录:

  1、文件系统:

    UNIX文件系统是目录和文件的一种层次结构,所有东西的起点是称为根(root)的目录,这个目录的名称是一个字符“/”。

    目录(directory)是一个包含目录项的文件。在逻辑上,可以认为每个目录项都包含一个文件名。同时还包含说明该文件属性的信息。文件属性是指文件类型(是普通文件还是目录等)、文件大小、文件所有者、文件权限(其   它用户能否访问该文件)以及文件最后的修改时间等。stat和fstat函数返回包含所有文件属性的一个信息结构。

    注:

    目录项的逻辑视图与时间存在磁盘上的方式是不同的。UNIX文件系统的大多数实现并不在目录项中存放属性,这是因为当一个文件具有多个硬链接时,很难保持多个属性副本之间的同步。

  2、文件名:

    创建新目录时会自动冲击两个文件名:.(称为点)和..(称为点点)。点指向当前目录,点点指向父目录。在最高层次的根目录中,点点与点相同。

  3、路径名:

    由斜线分隔的一个或多个文件名组成的序列(也可以斜线开头)构成路径名(pathname),以斜线开头的路径名称称为绝对路径(absolute pathname),否则称为相对路径名(relative pathname)。相对路径名指向相对于当前  目录的文件。文件系统根的名字是一个特殊的绝对路径名,它不包含文件名。

     #include "apue.h"
       #include <dirent.h>
     
    int main(int argc, char *argv[])
    {
      DIR             *dp;
      struct dirent   *dirp;
  

      if (argc != 2) {
        err_quit("Usage: is directory_name");
      }
     
      if ((dp = opendir(argv[1])) == NULL) {
        err_sys("Can not open %s\n",argv[1]);
      }
     
      while ((dirp = readdir(dp)) != NULL) {
        printf("%s\n",dirp->d_name);
      }
    }

  4、工作目录:

    每一个进程都有一个工作目录(working directory),有时也称为当前工作目录(current working directory)。所以相对路径名都从工作目录开始解释。进程可以用chdir函数更改工作目录。

输入输出

  1、文件描述符(file descriptor):

    通常是一个小的非负整数,内核用以表示一个特定进程正在访问的文件。当内核打开一个现有文件或者创建一个新文件时,它都返回一个文件描述符。在读、写文件时,可以使用这个文件描述符。

  

  2、标准输入、标准输出和标准错误:

    按照惯例,每当运行一个新程序时,所有的shell都为其打开三个文件描述符,既标准输入(standard input)、标准输出(standard output)以及标准错误(standard error)。

  3、不带缓冲的IO:
  

    函数open、read、write、lseek以及close提供了不带缓冲的I/O。这些函数都使用文件描述符。

   #include "apue.h"
     
    #define BUFFERSIZE 4096
     
    int main(void)
    {
      int             n;
      char            buf[BUFFERSIZE];
    
      while (n = read(STDIN_FILENO, buf, BUFFERSIZE) > 0) {
        if (write(STDOUT_FILENO, buf, n) != n) {
          err_sys("write error");
        }
      }
     
      if (n < 0) {
        err_sys("read error");
      }
     
      exit(0);
    }

  4、标准I/O

    标准I/O函数为那些不带缓冲的I/O函数提供了一个带缓冲的接口。使用标准I/O函数无须担心如何选取最佳的缓冲区大小。使用标准I/O函数还能建行对输入行的处理。例如,fgets函数读取一个完成的行,而read函数读取指定字节  数。
    函数fgetc一次读取一个字符,然后函数putc将此字符写到标准输出。读到输入的最后一个字节时,getc返回常量EOF。

程序和进程
  

  1、程序:

    程序是一个存储在磁盘上某个目录的可执行文件。内核使用exec函数将程序读入内存并执行程序。

  2、进程和进程ID:

    程序的执行实例称为进程(process)。某些操作系统用任务(task)来表示正在被执行的程序。

    UNIX系统确保每一个进程都有一个唯一的数字标识符,称为进程ID(process ID)。进程ID总是一个非负整数。

    #include "apue.h"
     
    int main(void)
    {
      printf("hello world from process ID %ld\n", (long)getpid());
      exit(0);
    }

  3、进程控制:

    有三个用于进程控制的主要函数:fork、exec和waitpid。(exec函数有7中变体,但经常把它们统称为exec函数。)

    //TODO

  4、线程和线程ID:

    一个进程内的所有线程共享同一地址空间、文件描述符、栈以及与集成相关的属性。因为它们能访问同一存储区,所以各线程在访问共享数据时需要采取同步措施以避免不一致性。

    与进程相同,线程也用ID标识。但是,线程ID只在它所属的进程内起作用。一个进程中的线程ID只在它所属的进程中起作用。一个进程中的线程ID在另一个进程中没有意义。在一个进程中对某个特定的线程进行处理时,我么可以  使用该线程的ID引用它。

时间值:

  UNIX系统有两种不同的时间值。

  1、日历时间:

     该值是自协调世界时1970年1月1日00:00:00这个特定时间以来所经过的秒数累计值。这些时间值可用于记录文件最近一次的修改时间。

  系统基本数据类型time_t用于保存这种时间值。

  2、进程时间:

    也被称为CPU时间,用以度量进程使用的中央处理器资源。进程事件以时钟滴答计算。

    系统基本数据类型clock_t保存这种时间值。

系统调用和库函数:

  所有的操作系统都提供多次服务的入口点,由此程序想内核请求服务。各种版本的UNIX实现都提供良好定义、数量有限、直接进入内核的入口点,这些入口点被称为系统调用(system call)

UNIX读书笔记----UNIX基础知识的更多相关文章

  1. PILE读书笔记_基础知识

    程序的构成 Linux下二进制可执行程序的格式一般为ELF格式. 我们可以用readelf命令来读取二进制的信息. ELF文件的主要内容就是由各个section及symbol表组成的. 下面来分别介绍 ...

  2. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  3. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  4. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  5. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

  6. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

  7. (C/C++学习笔记) 一. 基础知识

    一. 基础知识 ● 程序和C/C++ 程序: 根据Wirth (1976), Algorithms + Data Structures = Programs. Whence C: 1972, Denn ...

  8. The art of multipropcessor programming 读书笔记-硬件基础1

    本系列是 The art of multipropcessor programming 的读书笔记,在原版图书的基础上,结合 OpenJDK 11 以上的版本的代码进行理解和实现.并根据个人的查资料以 ...

  9. PHP笔记1__基础知识

    客户端: 美妙的网页组成(都是由浏览器解释): 1.HTML 2.CSS--给HTML化妆 3.客户端脚本编程语言(JavaScript等)--特效  服务器端: 1.Web服务器Apache/Ngi ...

随机推荐

  1. UGUI ScrollView中显示模型和特效

    游戏开发中有时候会遇到在UI上显示模型和特效的需求,这次需要在ScrollView上显示.我们使用UGUI的Screen Space - Camera模式,修改模型和特效的layer使之显示在UI上面 ...

  2. 网络、TCP协议与UDP协议

    1.网络模型 (1)什么是网络模型 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外 ...

  3. Java小白集合源码的学习系列:ArrayList

    ArrayList源码学习 本文基于JDK1.8版本,对集合中的巨头ArrayList做一定的源码学习,将会参考大量资料,在文章后面都将会给出参考文章链接,本文用以巩固学习知识. ArrayList的 ...

  4. 最短路Dijkstra算法模板

    // // dijkstra妯℃澘.cpp // algorithm // // Created by david.xu on 2018/8/6. // Copyright 漏 2018骞?david ...

  5. Python解析json字符串,json字符串用法

    json数据简介 json数据是一个轻量级的数据交换格式,采用完全独立于语言的文本格式,这些特性使json称为理想的数据交换语言,易于人阅读和编写,同时易于机器解析和生成. json中的字符集必须是U ...

  6. SEVERE: Unable to process Jar entry [avassist xxxx.class]

    <bean id="sqlSessionTemplate2" class="org.mybatis.spring.SqlSessionTemplate" ...

  7. c#数字图像处理(四)线性点运算

    灰度图像的点运算可分为线性点运算和非线性点运算两种.4.1线性点运算定义线性点运算就是输出灰度级与输入灰度级呈线性关系的点运算.在这种情况下,灰度变换函数的形式为: g(x, y)=pf(x,y)+L ...

  8. Doxygen -- part 2

    Documenting the code 这个章节涵盖两个主题: 如何在你的代码中放置注释, 一遍doxygen可以在生成的文档中囊括它们. 如何组织一个注释块的内容, 以使得输出美观. 特殊注释块 ...

  9. Kafka -入门学习

    kafka 1. 介绍 官网 http://kafka.apache.org/ 介绍 http://kafka.apache.org/intro 2. 快速开始 1. 安装 路径: http://ka ...

  10. Intellij IDEA中将打开的代码与类文件进行关联

    Intellij IDEA中在导航栏打开多个类时,如何快速定位到某个类所在的目录? 经过研究,可以通过以下设置完成: 设置完成后,点击导航栏中的类,左边的Project导航就可以快速定位到该类所在的目 ...