Linux基本概念

目录

  • 1. 内核、内核态和用户态
  • 2. 用户和组
  • 3. 文件和文件系统
  • 4. I/O模型
  • 5. 程序、进程、线程和协程
  • 6. shell、终端和会话

1. 内核、内核态和用户态

? 内核是指管理和分配计算机资源的核心层软件。其中计算机资源包括CPU、RAM(随机存取存储器)和设备。内核有以下职责:

- 进程调度

- 内存管理

- 提供文件系统

- 创建和终止进程

- 设备访问

- 联网

- 提供系统调用应用编程接口(API)

? 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据,并发送到网络, CPU划分出两个权限等级——用户态和内核态。内核态可以访问所有数据,包括所有程序的内存、联机的所有设备等。用户态只能访问当前程序的内存,也不能访问任何外围设备,如果要访问就需要调用内核提供的API。

2. 用户和组

? 系统的每个用户都拥有唯一的登录名,一个用户可以隶属于多个组。用户和组分别记录在/etc/passwd 和/etc/group文件中。为了保证用户的密码安全,经过加密的密码存在/etc/shadow中。

? etc/passwd文件可以使用getpwnam()和getpwuid()来读取。

   /*   由:分隔,分别对应结构中对应的字段
   *    root:x:0:0:root:/root:/usr/bin/zsh
   */
   struct passwd {
       char *pw_name;       //Login name
       char *pw_passwd; //Encrypted password
       uid_t pw_uid;        //User Id
       gid_t pw_gid;        //Group Id
       char *pw_gecos;      //@Deprecated
       char *pw_dir;        //Initial working directory
       char *pw_shell;      //Login shell
   };
   #include <pwd.h>
   struct passwd *getpwnam(const char *name);
   struct passwd *getpwid(uid_t uid);

   /* 扫描/etc/passwd文件  */
   struct passwd *getpwent(void);
   void setpwent(void); //设置指针到开头
   void endpwent(void); //扫描完成关闭文件

? etc/group文件可以使用getpwnam()和getpwuid()来读取。

   /*   由:分隔,分别对应结构中对应的字段
   *    adm:x:4:syslog
   */
   struct group {
       char *gr_name;       //Group name
       char *gr_passwd; //Encrypted password
       gid_t gr_gid;        //Group Id
       char **gr_men;       //Members list
   };
   #include <grp.h>
   struct group *getgrnam(const char *name);
   struct group *getgrgid(gid_t gid);

   /* 扫描/etc/group文件  */
   struct group *getgrent(void);
   void setgrent(void); //设置指针到开头
   void endgrent(void); //扫描完成关闭文件

? etc/shadow文件可以使用getspnam()来读取。

   /*   由:分隔,分别对应结构中对应的字段
   *    root:*:17737:0:99999:7:::
   */
   struct spwd {
       char *sp_name;       //Login name
       char *sp_pwdp;       //Encrypted password
       ...
   };
   #include <shadow.h>
   struct spwd *getspnam(const char *name);

   /* 扫描/etc/shadow文件  */
   struct group *getspent(void);
   void setspent(void); //设置指针到开头
   void endspent(void); //扫描完成关闭文件

? 我们可以使用标准密码认证,我们可以对输入的密码进行加密与/etc/shadow中存储的sp_pwdp进行比较。加密算法封装于crypt()函数中。

   #define _XOPEN_SOURCE
   #include <unistd.h>

   char *crypt(const char *key, const char *salt);

? 认证示例:

   ...
   struct *wpd = getpwnam(username);
   struct *spwd  = getspnam(username);
   if (spwd != NULL)
       wpd->pw_passwd = spwd->sp_pwdp;
   char *password = getpass("Password:");
   char *encrypted = crypt(password, pwd->pw_passwd);
   ...      //clear password and validity check
   Boolean authOk = strcmp(encrypted, pwd->pw_passwd) == 0;
   if (authOk)
       //success

3. 文件和文件系统

? 在Linux下,一切皆文件。包括设备、管道、套接字、目录及符号链接等。文件都可以使用同一套系统调用执行I/O操作。内核维护着一套单根目录结构,系统的所有文件都放到根目录“/”下。

? 文件的系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。磁盘驱动器是一种机械装置,由一个或多个高速旋转的盘片组成。通过在磁盘上快速移动的读写磁头,便可获取/修改磁盘表面的磁盘编码信息。磁盘表面信息物理上存储于磁道的一组同心圆上。磁道自身又被划分为若干扇区,每个扇区则包含一系列物理块。物理块的容量一般为512字节(或512的倍数),代表了驱动器可读写的最小信息单元。文件系统中用来分配空间的基本单位是逻辑块,即文件系统所在磁盘设备上若干连续的物理块。每块磁盘划分为一个或多个(不重叠)分区,每个分区视为/dev路径下的单独设备。分区可以容纳文件系统、数据区域或交换区域。文件系统由引导块、超级块、i-node表和数据块组成。

? 引导块总是文件系统的首块,是在计算机启动后初始自举,找到操作系统内核所在磁盘分区,并把内核加载到内存中。超级块记录文件系统有关的参数信息,包括i-node表容量,文件系统的逻辑块大小和文件系统的逻辑块数量。i-node表和数据块类似链表结构,i-node记录索引和指针,指针指向数据块地址。文件名存在数据块中。 在目录文件中,文件数据块中存入i-node索引,这个映射称为硬链接,在数据块中存入另一个数据块的文件名称为软链接。

? 文件属性可以使用stat()、lstat()和fstat()获取文件属性。

   struct stat {
       dev_t    st_dev;
       ino_t    st_ino;
       mode_t   st_mode;    //File type and permissions
       nlink_t  st_nlinke;
       uid_t    st_uid;     //User ID of file owner
       gid_t    st_gid;     //Group ID of file owner
       dev_t    st_rdev;
       off_t    st_size;    //Total file size (bytes)
       ...
   };

? st_mode字段内含有位掩码。可拆分为4部分,d rwx rwx rwx,分别表示:文件类型、属主权限(文件拥有者)、属组权限(与文件拥有者同用户组的其他用户)、其他用户组用户权限。

4. I/O模型

? UNIX I/O模型的显著特点之一就是其输入/输出的通用性概念。也就是说,同一套系统调用(open()、read()、write()、close()等)所执行的I/O操作,可施之于所有文件类型。所有执行I/O操作的系统调用都以文件描述符来指代打开的文件。其中0、1、2分别指代标准输入(stdin)、标准输出(stdout)、标准错误(stderr),这3个文件描述符始终是打开的。

  • 打开一个文件:open()
   #include <sys/stat.h>
   #include <fcntl.h>
   int open(const char *pathname, int flags, .../* mode_t mode */);

? flags参数是文件访问模式的位掩码

标志 用途
O_RDONLY 以只读方式打开
O_WRONLY 以只写方式打开
O_RDWR 以读写方式打开
O_CREAT 若文件不存在则创建之
O_DIRECTORY 若pathname不是目录,则失败
O_EXCL 与O_CREAT一起,如果文件已存在就不打开文件,返回错误EEXIST
O_LARGEFILE 在32位系统中使用此标志打开大文件
O_APPEND 总在文件尾部追加数据
O_TRUNC 如果文件已经存在且为普通文件,那么清空文件内容,长度置为0
... ...
  • 创建一个文件:creat()

    #include <fcntl.h>
    int creat(const char *pathname, mode_t mode);
  • 数据写入文件:write()
    #include <unistd.h>
    ssize_t write(int fd, void *buffer, size_t count);
  • 关闭文件:write()
    #include <unistd.h>
    int close(int fd);
  • 改变文件偏移量
    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence);

    ? whence参数表明应参照哪个基点来解释offset参数

标志 用途
SEEK_SET 从文件头部起始点开始偏移
SEEK_CUR 从当前文件偏移量开始偏移
SEEK_END 从文件尾部开始偏移
  • I/O控制方法:ioctl()

    #include <sys/ioctl.h>
    int ioctl(int fd, int request, .../* argp */);

5. 程序、进程、线程和协程

? 计算机程序是一组计算机能识别和执行的指令。通常以两种面目示人:源码形式和二进制形式。源码程序指人类可以阅读的文本文件,二进制指源码经过编译和链接处理后形成的二进制机器码。进程是正在执行的程序实例。每个进程可执行多个线程,线程为共享同一虚拟内存及一干其他属性的进程。进程和线程都是由内核进行调度,利用CPU时间片的概念进行抢占式调度,协程是用户级概念,完全由用户态程序自己调度。也就是说,内核并不知道协程的存在。

? 进程在内存上分布几个段:

- 文本:程序的指令

- 数据:程序使用的静态变量

- 堆:程序可从该区域动态分配额外内存

- 栈:随函数调用、返回而增减的一片内存,用于局部变量和函数调用链接信息分配存储空间

? 所有用户进程都由父进程创建,都有一个进程ID和父进程ID,所有进程之父为内核创建的PID为1的init进程。init进程和守护进程随系统开启而运行,系统关闭而终止。

? 我们可以使用getpid()和getppid()来获取进程ID和父进程ID

#include <sys/ioctl.h>
pid_t getpid(void);
pid_t getppid(void);

? 内核为每个进程都提供了相应的目录,命名为/proc/PID,该路径下包含但不限于以下文件:

文件 描述
cmdline 以\0分隔的命令行参数
cwd 指向当前工作目录的符号链接
Environ 环境信息,以\0分隔
exe 指向正在执行文件的符号链接
fd 指向由进程打开的文件的符号链接
maps 内存映射
men 进程虚拟内存
root 指向根目录的符号链接
status 进程状态信息(进程ID、凭证、内存使用量、信号等)
task 为进程中的每个线程均包含一个子目录

6. shell、终端和会话

原文地址:https://www.cnblogs.com/edwardorchis/p/11020364.html

时间: 2024-10-19 00:17:31

Linux基本概念的相关文章

LINUX 信号概念详解

LINUX 信号概念详解 我们运行如下命令,可看到Linux支持的信号列表: # kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP

Linux基础概念-----环境变量

Shell 环境变量 Shell也是应用程序,工作与用户模式 变量类型 整形 浮点型 字符型 布尔型 bash变量类型 本地变量:仅对当前Shell有效 局部变量:仅对局部代码段有效(函数) 环境变量:expor VAR_NAME=Value,对当前Shell及子Shell有效 位置变量:$1;$2 .... 特殊变量:$?;$!;$$ .... 查看环境变量 printenv export 查看所有变量 set bash的引号 双引号:弱引用,可以实现变量替换: 单引号:强引用,不替换,而显示

Linux基础概念-----Linux I/O重定向 ,管道

标准输入:键盘 标准输出:显示器 错误输出:显示器 FD:文件描述符:让程序可以文件交互,并且便于内核识别文件,打开的每一个文件都有一个描述符 程序在和文件交互式,通过文件描述符来进行交互,而非文件名,文件名是方便用户分别文件. Linux一切皆文件,所以标准输入,标准输出都有各自的文件描述符 标准输入描述符:0 标准输出描述符:1 标准错误输出描述符:2 将其默认数据流改为其他设备:IO重定向 输出重定向 > 覆盖重定向 >> 追加重定向 /dev/null  黑洞 只针对当前Shel

Linux基础概念-----touch一个新文件背后发生的事情

一个普通用户在Shell下执行了一条命令,这背后发生了什么事情,是个人的一些总结,如果有不对的地方欢迎搭建指正,谢谢! touch /tmp/test.txt ####################################################################################### tom在Shell中执行这条命令,Shell将命令发给内核,并且判断命令是否存在,通过文件系统上的元数据判断tom是否有权限执行,内核从内存中加载出mkdir的指令

Linux基础概念-----Linux权限

权限对象: 属主:u 属组:g 其他人: o 所有人:a Linux基本权限 读:read 标识为:r 八进制标识为:4 写:write 标识为:w 八进制标识:2 执行:execution 标识为:x 八进制标识:1 特殊权限 setuid:仅对文件(可执行的二进制程序)有效,以文件的所有者身份执行 八进制表现为:4 [[email protected] tmp]# ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 30768 Feb 22  2012

Linux基础概念-----文件类型

普通文件:非目录或其他类型文件(-) 目录文件(d):Linux下目录也是文件,不过目录文件里面存放着是其他文件或目录的名字和对应的indoe号 indoe维基百科:inode是指在许多"类Unix文件系统"中的一种数据结构.每个inode保存了文件系统中的一个文件系统对象(包括文件.目录.设备文件.socket.管道, 等等)的元信息数据,但不包括数据内容或者文件名. 百度百科: inode 编号 用来识别文件类型,以及用于 stat C 函数的模式信息 文件的链接数目 属主的 UI

Linux基础概念-----目录结构

/bin    二进制,可执行的命令 /sbin   可执行命令,通常管理员有权限使用 /boot   引导,操作系统用于引导系统启动的文件    如:内核  grup /dev    设备文件所在的目录    如:硬盘等 Linux的设备类型: 字符设备:键盘 鼠标等  文件类型表现:c 块设备:硬盘  文件类型表现:b(block) 读取文件时,其实是访问的一个数据块 /etc    配置文件 /home   普通用户的家目录 /root   管理员的家目录 /lib    库文件 /lib

Linux进程概念与管理

一.Linux进程概念 1.进程:Process,是运行中的程序的一个副本,有生命周期,都由其父进程创建 Linux内核存储进程信息的固定格式:taskstruct 多个任务的的taskstruct组件的链表:task list 2.进程优先级:0-139 0:一般不使用 1-99:实时优先级:数字越大优先级越高,系统自动安排 100-139:静态优先级:数字越小优先级越高,可手动更改 3.Nice值:-20至19,对应于100到139 普通用户只能将自己的优先级调低,root用户可以随意调制

linux基础概念和个人笔记总结(6)

防伪码:曾经梦想仗剑走天涯,回过头,却发现还是放不下家的牵挂 后续理论的验证图文详解,我会更新,希望大家可以参考 第十一章 FTP文件传输服务 1.FTP连接 控制连接:tcp21端口,用于发送ftp命令信息 数据连接:tcp20端口,用于上传.下载数据 数据连接的建立类型: a.主动模式:服务器从20端口主动向客户端发起连接 b.被动模式:服务端在指定范围内某个端口被动等待客户端连接 2.FTP用户的类型 匿名用户:anonymous或ftp 本地用户:账号名称.密码等信息都保存在passwd

linux基础概念和个人笔记总结(1)

防伪码:青,取之于蓝而青于蓝:冰,水为之寒而寒于水 各位亲爱的朋友们,本次分为6次更新,共12章节,请大家务必温故而知新,重在消化理解,熟练掌握linux基础概念与命令 一.linux系统管理与维护 1.分区:/boot(100-200m) swap:(交换分区,建议是物理分区的1.5-2倍) /:剩余空间 root是管理员用户,区分于administrator 2.对初学者建议:关闭iptables a.chkconfig iptables off b.打开/etc/sysconfig/sel