Linux程序设计(1) Linux Basics
2023-08-18 15:56:02 # NJU # Linux程序设计

1. What is Linux?

根据 GNU 通用公共许可证开发的免费类 Unix 操作系统。

  1. 开源
  2. 受欢迎
  3. 支持大多数可用平台

1.1 GNU & Linux

GNU/Linux System

  • Linux kernel
  • GNU software/library

Distributions(发行版):

  • Ubuntu, Debian, Mint, Red Hat, Fodore, SuSe, Mandrake, Redflag…

image-20230214155540587

What is So Special for Linux?

  • 大多数软件(包括Linux内核)均为 GPL 版(GNU General Public License)
  • 称为”copyleft“(而不是”copyright”)
    1. 你可以复制软件
    2. 你可以获得源代码
    3. 你可以更改源代码并重新编译
    4. 你可以分发更改后的源和二进制文件
    5. 你可能会为此付费
  • 你只是不能更改许可证
    • 因此,所有客户都享有与您相同的权利
    • 因此,您真的不能单靠销售软件赚钱
  • 其他开源许可证 (例如BSD) 也可用

2. Linux Installation

2.1 Installing Linux

  1. 从可启动媒体启动系统
  2. 所有安装程序都需要执行本质上相同的步骤:
    1. 选择语言,键盘类型,鼠标类型
    2. 磁盘分区(Create partitions)
    3. 设置引导加载程序(Setup a boot loader)
    4. 配置网络
    5. 配置用户和认证
    6. 选择包装组
    7. 配置X
    8. 安装软件包
    9. 创建启动盘

2.2 Partitioning Theory

硬盘的分区组织方式

MBR

  1. 在基于Intel的计算机上必须进行分区
  2. 最多四个主分区
  3. 一个主分区可以是扩展分区
  4. 扩展分区可以容纳无限数量的逻辑分区(Linux:最大59)
    • 扩展分区可以放4个逻辑分区,或者将其中的逻辑分区换为二级的扩展分区

image-20230214162131763

上图中表示是一个双系统,所以同时有windows和linux

  1. hda:磁盘的第一个扇区包含 MBR 和分区表(早期的都是 MBR 组织的,后面使用了 GPT (使用GUID分区表))
  2. hda1:第一个主分区包含Windows 95文件系统
  3. hda2:第二主分区是扩展分区,拥有三个逻辑分区
  4. hda5:第一个逻辑分区包含一个Linux文件系统,该文件系统将被安装为/
  5. hda6:第二个逻辑分区包含一个Linux文件系统,该文件系统将挂载为/home
  6. hda7:第三个逻辑分区拥有一个Linux交换空间

MBR(Master Boot Record)

  • Size: 512 bytes (硬盘的首个扇区)
  • Addressed by BIOS(由 BIOS 寻址)
  • Content:
    • 446 bytes program code (to boot an OS)
    • 64 bytes partition table with max 4 entries
    • 2 bytes “magic number” (0x55AA)

GPT

image-20230214162723879

  • 保留的 MBR 是为了在较老的机器上也能读取到磁盘上的信息
  • GPT 是 MBR 不够用了才会选择使用
  • 支持上百个主分区,不需要扩展分区(支持超过128,但是windows限制128)
  • Header记录Entry信息,Entry记录Partition信息,形成三级结构
  • Secondary GPT 是备份,因此 GPT 相较于 MBR 方式会有更多的空间无法使用

2.3 File System

什么是文件系统

  • 操作系统中负责存取和管理文件的部分
  • A collection of files and certain of their attributes. It provides a name space for file serial numbers referring to those files. (susv3)

Linux 中的文件系统:

  • VFS
  • EXT2, EXT3, FAT32…

2.4 Disk Partitioning

  • 至少要创建
    • 根目录(/),750MB(建议1.5G或更高),需要指定一个主分区
    • 交换分区(swap),大小等于内存量,用于虚拟内存
  • 推荐:/boot(16MB),用于启动,常存放boot loader
  • 可能需要/想要创建其他分区:/usr,/usr/local,/var,/tmp,/opt,/home
    • 例如可以将 /home 指定一个主分区,那么向 home 文件夹存放数据会存放到对应的分区,形成挂载结构
  • Linux下的默认分区程序是fdisk,发行版可以添加自己的分区程序

2.5 Linux Startup Flow

image-20230217103017442

BIOS 通过查找硬盘,启动boot loader

init 是第一个启动的应用程序,是个用户态程序

  1. BIOS:
    • 检查内存,从非易失性内存中加载选项,检查启动设备,加载启动设备的MBR并执行它
  2. MBR
    • 包含一个”boot loader”和分区表
    • 传统上由 LILO/GRUB 设置
  3. Boot loader
    • 将压缩的内核映像加载到内存中
    • 内核解压缩并启动
  4. 初始化过程
    • 配置文件 /etc/inittab
    • 运行水平

Basic Input Output System(BIOS)

  • 检查内存和硬件是否正常(POST)
  • 从非易失性存储器中加载选项
    1. 内存时序
    2. 启动设备顺序
  • 检查启动设备:软盘,CD-ROM,硬盘等
  • 加载启动设备的 MBR 并执行

EFI

增强版的BIOS, 支持GPT,支持更多的设备

image-20230217103757283

Boot loader

  • 引导加载程序加载并启动Linux内核
    1. 可以将启动参数传递给Linux内核,例如设备信息
    2. 可以选择加载初始根磁盘
    3. 也可以启动其他操作系统
  • 通用引导加载程序:
    1. LILO:Linux Loader(很古老,不考)
    2. GRUB:Grand Unified Boot Loader
  • 除非使用其他引导加载程序,否则通常在/dev/hda中进行配置。

GRUB(Grand Unified Boot Loader)

  • 程序存储在 MBR (第一阶段) 和 /boot/grub (第1.5和第二阶段) 中
  • 了解文件系统结构;无需像LILO一样激活配置
  • 配置文件:/boot/grub/grub.cfg
    • 最重要就是配置内核和init文件的位置
  • 通过grub-install安装在MBR中
1
2
3
4
5
6
7
8
9
10
11
12
title Ubuntu, kernel 2.6.20-16-generic
root (hd0,1)
kernel /boot/vmlinuz-2.6.20-16-generic root=UUID=3f784cd9-516f-4808-a601-b19356f6bdea ro quiet splash locale=zh_CN vga=0x318 // 内核与参数
initrd /boot/initrd.img-2.6.20-16-generic // init程序

// 配置 windows
title Microsoft Windows XP
Professional
root (hd0, 0) // 0号磁盘0号分区
savedefault
makeactive
chainloader +1 // 找新的引导程序,windows有自己的

3. Using the System

3.1 Basic Knowledge

Installing Software on Linux

  • From a tarball
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 编译源代码安装软件:automake模式
tar zxvf application.tar.gz
cd application
./configure
make
su - # 只有make install需要切换root权限
make install # 将编译后的二进制码安装到系统

# cmake模式
tar zxvf application.tar.gz
cd application
mkdir build
cd build
cmake .. # cmake后面跟application目录,..即上级目录
make VERBOSE=1 # VERBOSE参数可选,仅多打印一些东西
su -
make install
  • yum + rpm (red hat系列使用rpm安装包)
    • RPM: RPM Package Management
      • rpm –q –a,查询
      • rpm –ivh package-name,安装
      • rpm –e package-name,卸载
    • 单独使用rpm会造成可能需要下载无数的依赖,因此需要管理工具的存在-yum
  • dpkg:ubuntu系列,类似rpm
  • apt-get command *:在线下载
    • update:下载最新的软件包列表
  • aptitude:可能能解决版本冲突

Multi-user and Multi-tasking

  • Linux是一个多用户,多任务的操作系统:多个用户可以同时运行多个彼此独立的任务。
  • 在使用系统之前,总是需要”登录”:用用户名,密码识别
  • 多种登录系统的方式
    1. 控制台:直接连接的键盘,鼠标,显示器
    2. 串口
    3. 网络连接

Virtual Terminal

  • 在大多数Linux发行版中,控制台模拟许多虚拟终端
  • 每个虚拟终端都可以看作是一个单独的直接连接的控制台:不同的用户可以使用不同的虚拟终端
  • 典型设置:
    1. VT 1-6:文本模式登录
    2. VT 7:图形模式登录提示(如果启用)
  • 使用Alt-Fn(如果在X中为Ctrl-Alt-Fn)在VT之间切换

Linux Commands

  • Linux系统上的所有操作都可以通过键入命令来完成:
    • 运行Linux系统不需要GUI(X-Window),图形界面是一个用户态程序
  • 为了在 X-Window 中键入命令,您需要启动 终端模拟器(即图形界面中的终端)
  • 命令提示
    • 可以自己配置
      • 修改环境变量: export SUDO_PS1="\u@\h:\w\$", export PS1="\u@\h:\w\$"
    • $:以普通用户身份登录
    • #:以root身份登录
  • 命令提示符:用户名@计算机名:当前目录$

Command Syntax

  • Linux命令具有以下格式:
    • $ command option(s) argument(s)

3.2 Working with Files and Directories

  • 什么是文件?
    • 数据的集合
    • 可以写入或读取或两者兼有的对象。文件具有某些属性,包括访问权限和类型(susv3)
  • 文件结构
    • 通常:字节流,记录序列,记录树
    • 在Linux中:字节流

File Types

  1. 普通文件(regular file):
    • 文本或代码数据;没有特别的内部结构
  2. 字符型设备文件(character special file)
  3. 块型设备文件(block special file)
    • special files:代表硬件或逻辑设备
    • 位于 /dev 目录
  4. 网络接口(socket)
  5. 符号链接(symbolic link)
    • 软链接:类似windows上的快捷方式
    • 硬链接:同一个文件有两个文件名,创建出来的硬链接不占用磁盘空间和inode号。
  6. 目录(directory):该目录中的文件列表
  7. 管道(fifo)

驱动程序留给应用程序的接口, 只有三种

  • character special file
  • block special file
  • socket

Directory Structure

  • 所有Linux目录都包含在一个虚拟的”统一文件系统”中。
  • 物理设备挂载在挂载点上
    • 软盘
    • 硬盘分区
    • CD-ROM驱动器
  • 没有驱动器号,例如A:,C:,…

image-20230227143200633

Main Directories in Linux

image-20230227143638153

Linux Filesystem Hierarchy Standard

Basic Commands

  • passwd:更改密码
  • mkpasswd:生成随机密码
  • date,cal:找出今天的日期并显示日历
  • who,finger:找出还有谁在系统上处于活动状态
  • clear:清除屏幕
  • echo:在屏幕上写一条消息
  • write、wall、talk、mesg
    • write:给其他用户发信息
    • wall:write all, 给所有登录到系统的用户发信息
    • talk:建立聊天session
    • mesg:可以屏蔽用户发来的信息
  • pwd:当前目录
  • cd:更改目录
  • mkdir:创建目录
  • rmdir:删除目录
  • ls:列出目录的内容,-l,-a(显示隐藏文件, 形如.*),-R(递归打印所有的子目录中的文件)选项,-i
  • touch:更新文件的访问, 修改时间
  • cp:复制文件
  • mv:移动并重命名文件
  • ln:链接文件
  • rm:删除文件
  • cat:打印文件内容
  • more/less:逐页显示文件,more不可以回退,less可以回退
  • ps:报告进程状态
  • pstree:显示进程树
  • jobs, fg, bg, ctrl-z:作业控制
    • bg: 后台执行
    • fg: 前台执行
    • ctrl-z: 暂停进程, 可通过fg, bg恢复
  • kill:杀死进程
  • nohup:运行命令,忽略挂起信号
  • nice,renice:修改进程优先级
  • top:查看进程的cpu占用

  • 文件操作

    • 列出目录内容: ls, (dir, vdir 与ls功能类似)
    • 创建特殊文件: mkdir, mknod, mkfifo
      • mknod: 创建设备文件
      • mkfifo: 创建管道
    • 文件操作: cp, mv, rm
    • 修改文件属性: chmod, chown, chgrp, touch
      • chown: 改文件拥有者、用户组
      • chgrp: 更改用户组
    • 查找文件: (locate), find
      • locate: 功能和 find 类似
    • 字符串匹配: grep(egrep)
      • grep: 在文本文件中搜索字符串
      • egrep: grep 扩展
    • 其它: pwd, cd, ar, file, tar, more, less, head, tail, cat
      • ar: 打包库文件
      • file: 显示文件类型
      • more, less: 一页页显示
      • head, tail: 显示文件头部、尾部
  • 进程操作:ps, kill, jobs, fg, bg, nice
  • 其它
    • who, whoami, passwd, su, uname, …
      • whoami: 当前用户名
      • uname: 显示内核信息
    • man

File Permission

  • 文件权限可帮助保护文件免受其他用户侵害

  • 三个访问级别:

    1. 用户(User):创建文件的用户
    2. 组(Group):拥有文件的组中的所有用户
    3. 其他(Others):其他
  • 三个权限:

    1. 读取(r):读取文件内容或目录内容
    2. 写(w):更改文件内容或在目录中创建/删除文件
    3. 执行(x):以程序执行文件或使用目录作为活动目录
  • ls -l

    image-20230227153229304

Changing Permissions

  • chmod <who operator what> filename

    • who:

      • u = owner of file
      • g = group
      • o = other users on the system
      • a = all(u + g + o)
    • operator:

      • + = add permission

      • - = remove permission

      • = = clear permissions and set to mode specified
    • what: r, w, x

  • chmod <number> file

image-20230227154029252

Default File Permissions

类型 权限 数字权限
File -rw-r—r— 644
Directory drwxr-xr-x 755

Editing Files

  • vi、emacs、gedit

3.3 Working with Processes

什么是进程

  • A process is a task.
  • 进程是一个正在执行的程序实例。由执行程序,它的当前值,状态信息以及通过操作系统管理此进程执行情况的资源组成。
  • An address space with one or more threads executing within that address space, and the required system resources for those threads. (susv3)
  • 正在运行的程序就是进程的一个示例

image-20230303101357067

  • shell是一个读取命令并启动适当进程的进程
    • echo $$

Starting and Stopping a Process

  • 所有进程均由其他进程启动
    1. 父子关系
    2. 一个例外:init (PID 1) 由内核本身启动
    3. 树层次结构
  • 可以终止进程的原因有两个:
    1. 该进程完成后会自行终止。
    2. 该进程被另一个进程的信号终止

Daemons

“守护进程”一词指的是一个永不停止的进程,通常是控制诸如打印机队列之类的系统资源或执行网络服务的系统进程。

image-20230303103555052

3.4 Linux Documentation

How to Find Help?

  • man
  • info
  • command –-help
  • HOWTO 文档
  • 参考互联网

The man command

  • 使用 man 命令,您可以阅读命令的手册页
  • 手册页存储在 /usr/man
  • 手册页包括:
    1. 名称:命令名称和在线说明
    2. 概要:命令的语法
    3. 描述:有关命令的工作方式及其作用的说明
    4. 文件:命令使用的文件
    5. 错误:已知的错误和错误
    6. 另请参阅:与此命令相关的其他命令
  • “-k”选项:
    • man –k: 是否还有其他版本说明书
    • 要选择正确的部分,请添加部分编号:man 1 passwd,man 5 passwd
  • 手册分为8个部分:
    1. 用户命令
    2. 系统调用
    3. 库调用
    4. 设备
    5. 文件格式和协议
    6. 游戏
    7. 公约,宏程序包等
    8. 系统管理

The info command

  • 用于阅读文档的程序,有时可以代替手册页
  • 有关信息的信息存储在 /usr/info
  • 一些信息命令:
    1. space:下一屏文字
    2. delete:上一屏文字
    3. n:下一个节点
    4. p:上一个节点
    5. u:上节点
    6. q:退出信息
    7. tab:跳至下一个菜单项

4. Linux/UNIX Overview

  • 早期的UNIX
    • 一个简单的文件系统
    • 一个进程子系统和一个Shell
  • 内核和核外程序

image-20230303104322848

Programmer’s Viewpoint

image-20230303105118990

5. Linux System Basic

5.1 重定向

  • 标准输入、标准输出、标准错误

    • 对应的文件描述符:0, 1, 2
    • C语言变量:stdin, stdout, stderr
  • <, >, >>, 2>, 2>>, &>

    • 例: kill –HUP 1234 > killout.txt 2> killerr.txt
    • 例: kill –HUP 1234 > killout.txt 2>& 1
      • &1: 1号fd, 不加&会重定向到名称为1的文件
    • <: 重定向 0号fd
    • >: 重定向内容会覆盖掉文件, 默认重定向 1号fd
    • >>: 重定向内容追加到文件末尾, 默认重定向 1号fd
    • 2>: 只重定向 2号fd 的内容
    • &>: 重定向 1,2号fd
1
2
3
4
5
6
7
8
9
cat < abc.txt
cat 文件名

# 这里的文件名作为cat参数存在
# 类似于C语言中,main(int argc, char** argv)
# 当argc等于0,在system.in中读,再system.out打印
# 当cat后面加上参数,就读出文件内容,输出在屏幕上
# cat < 文件名,这里是重定向
# 执行流程完全不一样,仍然是走else分支

5.2 管道

  • 一个进程的输出作为另一个进程的输入
  • 存在一个管道文件,这个文件作为输入传递给后面的命令
  • 例:
    • ls | wc –l
    • ls –lF | grep ^d
    • ar t /usr/lib/libc.a | grep printf | pr -4 -t

5.3 环境变量

  • 环境变量
    • 操作环境的参数
    • 查看和设置环境变量:echo, env, set
      • env: 显示所有环境变量
      • set: 设置环境变量
  • 例: PATH环境变量
    • echo $PATH
    • /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/song/bin
    • PATH=$PATH:.
    • export PATH

5.4 高级命令与正则表达式

  • find: 查找磁盘上的文件
    • 可以使用通配符, 可以通过文件大小查找, 可以使用逻辑表达式
    • 可以对找到的每一个文件执行一个命令
    • find / -name '*.cpp' | xargs grep main -n 2> /dev/null
  • sed: 用于做替换
    • 可以把文本文件里的一段内容替换为其他内容
    • sed 's/\([0-9A-Za-z_]\{1,\}\)\[ \{0,\}\]\[ \{0,\}\]/*\1\[\]/g' code1.cpp
      • ‘s/…/…/g’
      • 将第一个省略号内容替换为第二个省略号内容
      • g表示每行全部都匹配, 不加每行最多匹配一次
  • grep