《Unix/linux系统编程》教材第1、2章学习笔记

发布时间 2023-09-10 17:59:54作者: 20211424罗杰逊

第1章:引 言

关于本书
是研究Unix/Linux系统编程的专著。其中涵盖Unix/Linux的所有基本组件,包括进程管理、并发编程、定时器和时钟服务、文件系统、网络编程和MySQL数据库系统。

关于Unix
Unix是一种通用型操作系统,采用PDP-11微型计算机开发,有许多个版本。

  • AT&T Unix
  • Berkeley Unix
  • HP Unix
  • IBM Unix
  • Sun Unix

关于Linux
Linux是一个类Unix开源系统,最初由李纳斯基于Intel x86的个人计算机开发的一个实验性内核,目前也存在多个版本。

  • Debian Linux
  • Ubuntu Linux
  • Linux Mint
  • 基于RPM的Linux
  • Slackware Linux

虚拟机上的Linux
在Microsoft Windows 10内的虚拟机上安装并运行Linux

  • VirtualBox
  1. 安装教程
  2. 调整屏幕分辨率:
    按照教材内容打开终端,输入命令行xdiagnose,发现要先下载,下载时候出现下图问题

通过向gpt提问发现是有另一个软件包管理器正在运行,执行sudo fuser -vki /var/lib/dpkg/lock命令关闭进程后解决

再次使用sudo xdiagnose,按照下图选择即可改变分辨率

3.在Ubuntu下测试C语言
使用sudo apt-get install emacs安装emacs

  • VMware

使用 Ubuntu Linux

  • Ctrl+ALT+T组合键打开伪终端
  • 用户为普通用户,要运行任何特权命令,用户必须输入sudo command
  • 为了在当前目录下运行程序,用户每次都必须输入./a.out
  • 一般安装的Linux版本为64位,若需要生成32位需要使用gcc -m32 t.c # compile t.c into 32-bit code

文件系统组织

  • 采用树形组织结构

  • 文件路径名
    文件系统数树的根节点(用“/”表示)称为根目录,文件系统树的每个节点都由以下的路径名指定:
    /a/b/c/d or a/b/c/d
    以“/”开头的为绝对路径名,反之则为相对于进程当前工作目录(CWD)的相对路径名。登录时,CWD被设置为主目录。CWD可以通过cd命令更改。pwd可以打印CWD的绝对路径名。

  • 常用命令
    ls:ls dirname:列出CWD或者目录内容
    cd dirname:跳转目录
    pwd:打印绝对路径
    touch file:改变文件名时间戳(如果文件不存在,则创建文件)
    cat file:显示文件内容
    cp src dest:复制文件
    mv src dest:移动或重命名文件
    mkdir dir:创建目录
    rmdir dir:删除(空)目录
    rm file:删除文件
    ln old new:链接文件
    find:搜索文件
    grep:搜索包含
    ssh:远处登录主机``
    gzip file:压缩为.gz
    gunzip file.gz:解压.gz
    tar -zcvf file.tgz .:从当前目录创建压缩tar
    tar -zxvf file.tgz .:从.tgz文件中解压文件
    man:手册(man command)
    zip file.zip file:将文件压缩为.zip文件
    unzip file.zip:解压.zip文件

  • Linux手册
    在Ubuntu Linux中保存在/usr/share/man/目录下,使用手册页例子:
    man ls:显示man1中ls命令的手册页
    man 2 open:显示man2中open函数的手册页

Ubuntu Linux系统管理

  • 添加新用户
    sudo adduer username

  • sudo命令
    在sudoers中添加username ALL(ALL) ALL来确保用户能够发出sudo

第2章:编程背景

Linux文本编辑器

  1. vim
    vim启动时处于命令模式,输入
    i:切换到插入如模式,插入文本
    a:切换到插入模式,追加文本
    退出插入模式按ESC一次或多次。

在命令模式下,输入“:”进入末行模式,将文本保存为文件或者退出vim:
:w:写入(保存)文件
:q:退出vim
:q!:不保存更改,强制退出

2.gedit
是GNOME桌面环境默认的文本编辑器(包括ununtu)。

3.emacs
强大,apt-get install emacs下载。

程序开发

  • 程序开发步骤
    1.创建源文件
    注释:“/”和“/”或者“//”
    变量:全局变量、局部变量、静态变量(可以初始化)、自动变量和寄存器变量。
    2.用gcc把源文件转换为二进制文件
    3.gcc是什么
    是一个程序,包含3步:
    第一步:将C源代码文件转换为汇编代码文件,.c转为.s
    第二步:把汇编代码转换为目标代码,.s转为.o
    第三步:链接,调用链接器将所有.o文件和必要的库函数组合成单一的二进制可执行文件。

  • 静态与动态链接
    创建二进制文件的两种形式
    动态链接:可减小每个a.out文件的大小;许多程序可以共享库函数。

  • a.out文件内容
    1.文件头
    2.代码段:也称正文段
    3.数据段
    4.符号表

C语言中的函数调用

  • 64位GCC中的运行时堆栈使用情况
    与32有一些不同,调用函数时,前六个参数依次进入rdi、rsi、rdx、rcx、r8、r9,其他任何参数通过堆栈。进入后先建立栈帧(rbp),肯呢个向下移动堆栈指针(rsp)。GCC编译生成的代码可保持堆栈指针固定不懂,默认保留红色区域堆栈128字节。

C语言程序与汇编代码的链接

  • 汇编代码说明
    GCC生成的汇编代码由三部分组成:
    1.入口代码:prolog
    2.函数体代码:
    3.退出代码:epilog

链接库

  • 静态链接库

gcc -c mysum.c
ar rcs libmylib.a mysum.o
gcc -static t.c -L. -lmylib
a.out

-L.指定链接库路径,-l指定链接库

  • 动态链接库
    gcc -c -fPIC mysum.c
    gcc -shared -o libmylib.so mysum.o
    gcc t.c -L. -lmylib
    export LD_LIBRARY_PATH=./
    a.out

如果链接库不在当前目录中,只需要更改-L.选项。

makefile

  • 格式
    一个make文件由一系列目标项、依赖项和项目组成。

  • make程序
    通常,我们会使用sh命令
    gcc -o myt main.c mysum.c
    生成一个名为myt的二进制可执行文件。

GDB调试工具

  • 在emacs IDE中使用GDB
  1. 源代码:
    在X-window下打开一个伪终端,使用EMACS创建makefile
t:t.c
  	gcc -g -o t t.c
  1. 编译源代码:
    打开EMACS的Tools菜单,然后选择Compile。EMACS将在编辑窗口底部显示一个提示行
    make -k
    并等待响应
  2. 启动GDB:
    打开tools菜单并选择Debugger,底部会显示提示行
    gdb -i=mi t
    并等待响应,按enter键启动GDB调试工具
  3. 多窗口GBD:
    从GDB菜单中,选择Gud->GDB-MI->Display Other Windows,GBD将在不同的窗口中显示GDB缓冲区。

学习过程中的问题和解决过程

问题及其解决过程已展示在上示总结中。

针对知识点与gpt的对话

  1. vim文本编辑器



  2. C语言程序与汇编代码的链接



程序实现与代码


hello.c:

#include "hello.h"
void ljx()
{
printf("hello!\n");
}

main.c:

#include "hello.h"
int main(){
ljx();
}

hello.h:

#ifndef ___HELLO_H___
#define ___HELLO_H___
void ljx();
#endif