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)

最新文章

  1. C# interface abstract class
  2. OC宏和常量
  3. Django HTML 显示文章摘要
  4. Objective-C( 语法二)
  5. raid0
  6. client denied by server configuration
  7. King&#39;s Quest
  8. [内存管理]管理图解v0.1 v0.2 v0.3
  9. HelloGitHub.com 网站开源了
  10. python kline
  11. structure
  12. H5新特性---SVG--椭圆--直线--文本--滤镜(高斯滤镜--模糊)--地理定位
  13. Cross Validation(交叉验证)
  14. Flask中路由系统、Flask的参数及app的配置
  15. 501. Find Mode in Binary Search Tree【LeetCode by java】
  16. 在CentOS 6.4中支持exfat格式的U盘
  17. 获取IP和mac地址
  18. Android应用程序的基本组件介绍
  19. Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程
  20. 如何监控ActiveMQ

热门文章

  1. GPU图形绘制管线简介
  2. [思维导图] C标准库
  3. python爬虫——requests库使用代理
  4. Spring Boot 入门(十二):报表导出,对比poi、jxl和esayExcel的效率
  5. 2019CSP复赛游记
  6. java 方法定义 调用
  7. Oracle设置序列方法
  8. 「 从0到1学习微服务SpringCloud 」05服务消费者Fegin
  9. 我的C++开发工具链
  10. 解决luajit ffi cdata引用cdata的问题