UNIX / LINUX 基础知识

Posted kalier

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNIX / LINUX 基础知识相关的知识,希望对你有一定的参考价值。


1. UNIX 的体系结构

首先要更正大家的一点认识上的盲区,大家认为操作系统是一种软件吗?他和内核(kernel)有什么区别呢?


从广义上来说,操作系统包括内核和一些其他必要的软件,比如即将发布的 Ubuntu 18.04 LTS 采用 gnome 桌面环境,那么这个 gnome 就属于其他软件。正是因为有了这些其他软件,计算机才具有了自己的特色。从严格意义上来讲,操作系统就是内核这个软件。


2. 登陆

计算机一般都设有用户名和密码,开机后需要登录,而计算机是怎么确定我们输入的用户名和密码是合法而且能够进入计算机桌面系统或者字符界面系统的呢? 其实并不神秘, UNIX 系统或者类 UNIX 系统(Linux 系统)有这样一个文件, /etc/passwd,专门用于记录各个用户的信息。大家可以使用 cat /etc/passwd 这条命令查看里面的内容。不难发现,每一行都是类似于 chaojun:x:1000:1000:chaojun,:/home/chaojun:/bin/bash ,使用 6 个 : 分割成 7 个部分。每部分代表的含义如下:1、用户名(chaojun);2、用户密码(x,加密过得,并不就是 x);3、用户 ID(1000,用户不能修改,系统指定的);4、用户组 ID(1000,也是系统指定的);5、注释字段(chaojun,);6、用户家目录(/home/chaojun);7、用户使用的 shell 类型(/bin/bash)。


对于上面 7 个字段,我想只有 shell 类型需要解释一下。shell 是一种交互式的命令解释器,它读取用户的输入,然后将用户的输入当做命令执行。通常读取输入都是从键盘读取,这种方式就是交互式终端,另一种方式是从文件读取,这就是我们熟悉的 shell 脚本。当然 shell 的种类很多,这里就不讨论各种的好坏和区别了,感兴趣的读者可以自己 Google 一下。


3. 文件和目录

Linux 系统下有句话说的好:一切皆文件,当然,目录也是一种文件,称为目录文件。文件系统是目录和文件的一种层次结构,所有文件或者文件夹的起点都是 / 目录。对于文件和文件夹的命名,只要不包含 “/” 和 “ ”(空格)都是合法的,但是为了可移植性,POSIX.1 推荐只使用以下字符命名:字母、数字、下划线、点(.)、短横线(-)。


4. 输入输出

说到输入输出,不得不说的就是文件描述符,每运行一个程序,shell 都将打开三个文件描述符,即标准输入、标准输出和标准错误。内核打开或者创建一个文件也返回一个文件描述符,这个文件描述符在读写文件的时候都需要用到。那么打开、读写文件又是怎样进行的呢?


4.1. 不带缓冲的 I / O

系统函数 open 、read 、write 、lseek 以及 close 都提供了不带缓存的 I / O。这些函数都需要使用文件描述符。那么什么事不带缓存的 I / O 呢?这说来又会篇幅很多的,我将在后续笔记中详细说明带缓冲的 I / O 和不带缓冲的 I / O 的区别。


4.2. 标准 I / O

标准 I / O 就是为不带缓冲的 I / O 提供了一个缓冲的接口。例如 fopen、 fread等,那么我们最熟悉的带缓冲的 I / O 莫属于 printf 函数了,我们可以控制缓冲中的风格,比如打印一个整数 02, %d 和 %0d 打印出来的风格是不一样的,这就是 printf 函数的缓冲作用的表现。


5. 程序和进程


6. 出错处理

man 3 errno    //可以使用这个命令查看系统定义的出错常量

char *strerror(int errnum);    // 次函数将 errno 的值映射为一个字符串,然后返回指向此字符串的指针

void perror(const char *s);    // 基于当前的 errno 值,在标准错误上产生一条错误消息,调用此函数输出的格式为 “ s 指向的字符串: errono 值的出错消息 ”


7. 用户标识

在登陆的时候有说用户 ID,包括组 ID,用户都是不能修改的,是由系统管理员在用户登陆的时候分配的。在程序中可以使用 getuid() 和 getgid() 函数获取用户 ID 和用户组 ID。要补充说明的是一个用户可以属于多个组,称为附属组,所以一个用户可以有多个组 ID,POSIX 标准要求系统至少应该支持 8 个附属组,实际上大多数系统都至少支持 16 个附属组。


8. 信号

信号是针对进程出现的,进程对信号的处理方式有三种:1、忽略信号,不理会它;2、按系统默认的方式处理,比如在中断执行某个程序的时候,可以使用:ctrl + c 发送中断信号,这时就按系统默认的处理方式结束进程;3、提供一个函数,在收到信号的时候调用这个函数去处理,例如驱动中注册中断。


9. 时间值

chaojun@ubuntu:/code$ cd /usr/include/

chaojun@ubuntu:/usr/include$ time -p grep _POSIX_SOURCE */*.h > /dev/null 

real 0.32    // 这个是进程运行的时间总量

user 0.02    // 这个是用户 CPU 时间,执行用户指令所用的时间

sys 0.08    // 这个是系统 CPU 时间,为进程执行内核程序所用的时间

// 后两个时间之后通常被称为 CPU 时间

chaojun@ubuntu:/usr/include$ 

10. 系统调用和库函数

系统调用时操作系统提供多种服务的入口,而库函数是对系统调用的再次封装,实际上库函数还是要调用系统调用的。比如 malloc 库函数 需要调用系统调用中的 sbrk 函数。


11. 总结


chaojun@ubuntu:/usr/include$ ls -ldi . ..

1310725 drwxr-xr-x 53 root root 16384  3月 21 15:06 .

1310722 drwxr-xr-x 15 root root  4096  1月 20 23:14 ..

chaojun@ubuntu:/usr/include$ 

那么,每个目录中执行,会出现 第一列的两个数字相等的目录吗?如果会出现,是哪个目录?提示 -i 参数是打印文件节点编号,上面的 1310725 1310722 就是文件节点编号


以上是关于UNIX / LINUX 基础知识的主要内容,如果未能解决你的问题,请参考以下文章

UNIX / LINUX 基础知识

Linux系统基础知识

linux知识

Linux命令行基础

Linux基础二:初识linux命令

linux/unix -shell值iptables基础知识