第一章 unix基础知识

来源:互联网 发布:java单线程改多线程 编辑:程序博客网 时间:2024/06/14 09:59

1.1引言

所有操作系统都为它所运行的程序提供服务,典型的服务包括执行新程序,代开文件,读文件,分配存储区等

1.2unix体系结构

操作系统可以视为一种软件,它控制计算机的硬件资源,提供程序运行环境,此即为内核unix体系结构内核的接口称为系统调用,公用函数建立在系统接口之上,应用程序既可以使用公用库函数又可以使用系统调用。其实shell是一种特殊的应用程序,为运行其他程序提供了一个接口。 当然更广泛的认为操作系统包括了内核和一些其他软件,例如shell等一些实用软件。

1.3文件和目录

1.3.1文件系统

  • unix文件系统是一种文件和目录的一种层次结构,所有东西的起点是root目录,这个目录的名称是‘/’
  • 目录是一个包含目录项的文件,可以认为每个目录项都包含一个文件名和说明该文件的属性信息

    1.3.2文件名

  • 目录中的各个名字成为文件名
  • .(点)指向当前目录 ..(点点)指向父目录
  • 路径名分为绝对路径名和相对路径名
    1. 绝对路径名:以’/‘开头,相对于根目录
    2. 相对路径名:不是以’/‘开头,是相对于当前目录而言

      1.4输入和输出

      1.4.1文件描述符

      文件描述符是一个非负整数,内核用文件描述符来描述某个进程访问的文件,当打开一个现有的文件或者创建一个文件时都会返回一个文件描述符,在对文件进行读写等操作时会使用该文件描述符

      1.4.2标准输入,输出和标准错误

      每当运行一个程序时,shell都会为其打开三个文件描述符,即标准输入,标准输出,标准错误

      1.4.3不带缓冲的I/O

      函数open read write lseek 以及close提供了不带缓冲的i/o,这些函数都会用到文件描述符

      1.4.4标准I/O

      标准io为那些不带缓冲的io函数提供一个带缓冲的接口

      注意不带缓冲IO和标准IO在后面会有介绍

      1.5程序和进程

  • 程序是存储在磁盘上的某个目录下的可执行文件
  • 程序一旦执行起来就变成了进程,unix系统让每一个进程都有一个唯一的数字标识,该数子标识称为进程ID,进程ID总是一个非负数
  • 进程控制的函数有fork,exec和waitpid
  • 通常一个进程有一个线程,一个进程内的所有线程共享同一地址空间,文件描述符,栈等,同进程一样,线程也有线程ID,线程ID只在它所属的进程中起作用,一个进程中的线程ID在另一个进程中无意义

    1.6出错处理

  • 当unix系统函数出错时,通常会返回一个负值,而且整形变量errno通常被设置为具有特定信息的值。
  • 文件中定义了errno以及可以赋予它的各种变量,这些变量通常以字符E开头
  • 在多线程中,每个线程都有自己的局部errno,以避免一个线程干扰另一个线程
  • c标准定义了两个函数用于打印出错信息
  • strerror 函数将errnum映射为一个出错消息字符串,并返回此字符串的指针
    1. #include <string.h>
    2. char *strerror(int errnum);
    3. 返回值:指向消息字符串的指针
  • perror函数基于errno的当前值,在标准错误上产生一条错误信息,然后返回
    1. #include <stdio.h>
    2. void perror(const char *msg);
    3. 它先输出由msg指向的字符串,然后是一个冒号,一个空格,接着是对应于errno值得出错消息,最后是换行符
  • 示例
    1. #include<apue.h>
    2. include<errno.h>
    3. int main(int argc,char *argv[])
    4. {
    5. fprintf(stderr,"EACCES %s\n",strerror(EACCES));
    6. errno = ENOENT;
    7. perror(argv[0]);
    8. exit(0);
    9. }

    记得加运行结果

    1.6unix时间值

    1日历时间

    自1970年1月1日00:00:00开始以来所经历的秒数,系统数据类型time_t类型用于保存这种时间值

    2进程时间

    也称为cpu时间,以滴答计算,曾经每秒钟取值50,60个滴答,用clock_t保存这种时间值