首页 > 系统相关 >《Unix/Linux系统编程》第一、二章读书笔记

《Unix/Linux系统编程》第一、二章读书笔记

时间:2022-09-04 19:44:06浏览次数:86  
标签:文件 二章 读书笔记 C语言 Unix sh Linux 进程 out

自学教材1、2章学习笔记

一、任务要求

  • 学教材第1,2章,提交学习笔记(10分)
    • 知识点归纳以及自己最有收获的内容 (3分)
    • 问题与解决思路(2分)
    • 实践内容与截图,代码链接(3分)
    • 知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等(2分)

二、知识归纳

第一章

(0)书籍实现目标:

    • 提供高级编程所需背景知识和技能
      了解软件工具、程序开发步骤和程序执行的运行时环境,开发步骤包括汇编器、编译器、链接器、链接库、可执行文件内容、程序执行影响、函数调用约定、参数传递方案、局部变量、栈帧、C程序和汇编代码链接、程序终止和异常处理、Makefile和GDB的使用
      第二周的课堂上老师重点讲解了C程序源代码转换成可执行文件的全过程,这其中第一步是通过gcc -E命令将源代码使用编译器转换成.i文件(预处理),再通过gcc -S命令通过将.i文件转换成.s的汇编程序,之后通过gcc -c命令将.s文件转换成.o的目标文件(二进制机器码),最后用链接器-o将目标文件变为可执行文件。(记忆方法:ESc,iso)
    • 动态数据结构应用
      用二叉树模拟Unix/Linux文件系统树,支持pwd、ls、cd、mkdir等操作。
    • 进程管理
      各种进程的抽象。创建进程、按优先级调度进程、通过上下文切换运行不同进程、通过二叉树维护进程关系、使用sleep和wakeup原语实现等待子进程终止等。进程管理包括fork(),exit(),wait(),exit()等。还包括I/O重定向和管道。
    • 并发编程
      Pthreads编程,线程连接、互斥量、条件变量、信号量、屏障。
    • 定时器和定时功能
    • 信号处理和进程间通信
    • 文件系统
    • TCP/IP和网络编程

(1)安装虚拟机

用户登录

(2)Ubuntu Linux的使用

        命令执行规则:用户进程通常会执行命令解释程序sh,后者将提示用户执行命令。sh将直接执行一些特殊命令,(cd , exit , logout , &)非特殊命令通常是可执行文件。对于非特殊命令,sh会复刻子进程并等待该子进程终止。子进程会将其执行映像更改为文件,并执行新映像。子进程终止时会唤醒父进程sh,后者将执行另一个命令等。除简单命令,sh还支持 I/O 重定向和通过管道连接的符合命令。除内置命令外,用户还可以开发程序,将其编译为二进制的可执行文件,并按照命令运行程序。

 

Ubuntu Linux 的特性

    1、Ubuntu 的使用需要输入用户名和密码创建一个默认目录为 ”/home/username“ 的用户账号。当Ubuntu启动时,会自动登录默认用户

         ​ Ctrl+Alt+T 打开伪终端

 

每次开启一个新终端都是运行一个sh,提示用户执行新的命令

    2、出于安全考虑,用户应为普通用户,而不是根用户或者超级用户,要运行任何特权命令,需要输入:

​ sudo command

​ //但是会验证用户的密码。

    3、用户的 “PATH” (路径)环境变量设置通常不包括用户的当前目录。当前目录下运行程序,用户需要每次都输入:

​ ./a.out

所以为了方便起见,用户应更改路径设置,已包含当前目录,在用户主目录中,创建一个包括以下代码的 .bashrc 文件:

​ PATH=$PATH:./

用户每次打开伪终端时,sh 都会先执行.bashrc文件来设置路径,以包含当前工作目录。

    4、Ubuntu 支持有线和无线网络连接

(3)命令执行

 

 

 

第二章

(1)文本编辑器

教材中介绍了vim、gedit以及emacs三种编辑器,在课程中主要学习vim编辑器

 

(2)下载并使用emacs

问题:进行emacs的操作时,出现无法获得锁的情况

 

按照教程得以解决

无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 106164(unattended-upgr)持有 N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系_程序员界的小趴菜的博客-CSDN博客

 

输入emacs [FILENAME]打开emacs

 

 

 输入c语言代码

 

 

(3)在Linux环境下运行C语言代码

创建一个名为test的c语言文件,输入“i”编辑文件,编辑结束后esc推出编辑,输入“:wq”退出并保存文件

 

 

 

 

此时出现一个小问题:没有安装gcc,则输入sudo apt install gcc安装

手把手教你搭建Linux开发环境(VMware+Ubuntu)(四)——gcc编译器的安装和使用_JinrongLiang的博客-CSDN博客_ubuntu查看编译器版本

 

 

 

 

 

 安装完毕后即可实现c语言功能

(4)程序开发步骤分析

    • C语言程序中的变量可分为全局变量、局部变量、自动变量寄存器变量等。
      在大一C语言的课堂上,我们有详细了解过全局变量、局部变量,而在这里我了解到局部变量在默认情况下就是自动变量,编译器试图把寄存器变量存在CPU寄存器中,易失性变量用作内存映射I/O的地址或者通过中断处理程序或多个执行线程来访问的全局变量,易失性关键字可以阻止C编译器优化用这些变量进行操作的代码。
    • gcc三个步骤:将源文件转换为汇编代码(编译),将汇编代码转换成目标代码(汇编),将目标代码转换成二进制可执行文件(链接)
    • .o(汇编)文件包含
      • 一个文件头,包含代码段、数据段和BSS段的大小
      • 一个代码段,包含机器指令
      • 一个数据段,包含初始化全局变量和初始化静态局部变量
      • 一个BSS段,包含未初始化全局变量和未初始化静态局部变量
      • 代码中的指针以及数据和BSS中的偏移量的重定位信息
      • 一个符号表,包含非静态全局变量、函数名称及其属性
    • 静态和动态链接
      在使用静态库的静态链接中,链接器将所有必要的库函数代码和数据纳入a.out文件中。在执行动态链接的a.out文件时,操作系统将a.out文件和共享库均加载到内存中,使加载的库代码在执行期间可供a.out文件访问。
      动态链接的主要优点:可减小每个a.out文件的大小,许多执行程序可在内存中共享相同的库函数,修改苦不需要重新编译源文件。
      动态链接所用的库成为动态链接库(DLL)。它们在Linux中成为共享库(.so文件)。动态加载(DL)库是指仅按需加载的共享库。动态加载库可用作插件和动态加载模块。
    • 可执行文件
      • 二进制可执行平面文件
        包含可执行代码和初始化数据
      • a.out可执行文件
        传统的a.out文件包含文件头(包含文件的加载信息和大小,tsize = 代码段大小,dsize = 数据段大小,bsize = bss段大小,total——size = 加载的a.out文件总大小),然后是代码段(正文段,从标准C启动代码crt0.o开始,改代码调用main()函数)、数据段、bss段、符号表(可选)
        符号“_brk”表示bss段结束。a.out文件的总加载大小通常等于_brk(即tszie+dsize+bsize)。如果需要,_brk可以设置为更高值。
      • ELF可执行文件
        可执行的链接格式文件,包含一个或多个程序段,每个程序段均可可加载至特定的内存地址。在Linux中,默认的二进制可执行文件为ELF文件。

 

GDB调试工具

GDB断点设置指令总结:

(5)程序执行过程

在类Unix操作系统中,在sh命令行 a.out one two three

执行a.out文件,以标记字符串作为命令行参数
为执行命令,sh创建一个子进程并等待改子进程终止。子进程运行时,sh使用a.out文件执行新的执行映像

  • 读取a.out文件头

      Total_Size = _brk + stackSize
    

    普通的C语言程序将因为任一计算机上的堆栈溢出而产生分段错误(因此操作系统通常使用待启动程序的默认初始堆栈大小)

  • sh从总大小中分配一个内存区给执行映像。

  • sh放弃旧映像,开始执行新映像。

  • 执行从crt0.o开始,调用main(),将argc和argv作为参数传递给main(),可以写成

      int main(int argc, char *argv[]){ … }
    

(6)程序终止

  • 正常终止
    如果程序执行成功,main()最终会返回到crt0.out,调用库函数exit(0)来终止进程。
    exit(value)函数会执行一些清理请求,如刷新stdout、关闭I/O流等,然后发出一个_exit(value)系统调用,是进入操作系统内核的进程终止。退出值0通常表示正常终止。如需要,进程也可直接调用exit(value)。再直接一点,进程可能会发出_exit(value)系统调用以立即终止。
    内核中某个进程终止时,会在父进程结构体中将_exit(value)系统调用值记录为退出状态,通知其父进程并使该进程变为僵尸进程,父进程可通过系统调用

      pid = wait(int *status);
    

找到僵尸子进程,获得其pid和退出状态,并清空僵尸子进程的结构体,使该结构体可以被另一个进程重新使用。

  • 异常终止
    常见的有无效地址、非法指令、越权等。
    当某进程遇到异常时,它会陷入操作系统内核,内核的陷入处理程序将陷入错误类型转换为一个幻数(即信号。)
    除了错误导致的陷入,信号也可来自硬件或其他进程。
    如“Ctrl+C”组合键会产生硬件中断(向终端上所有进程发送数字2的信号SIGINT),(INT即为Linux中断),或者用户可使用命令

      kill -s signal_number pid # signal_number = 1 to 31
    

向pid识别的目标进程发送信号。
对于大多数信号数值,进程的默认操作是终止

(7)C语言背景

 

 

C语言结构体

(1)结构体是包括变量或数据对象集合的复合数据类型。C语言结构体类型由 struct 关键字定义。

next:指向下一个节点结构体的指针;

key:一个整数;

name:一个由64个字符组成的数组。

(2)定义结构体时,该结构体的每个字段都必须具有一个·1编译器已知的类型,但自引用指针除外;

每个C语言结构体数据对象都分配了一个连续内存块。C语言结构体的单个字段通过使用 .operater (.运算符)访问。

x.next:指向另一个NODE类型对象的指针;

x.key:这是一个整数;

x.name:这是64个字符组成的数组。

运行时,每个字段相对于结构体起始地址的偏移量进行访问。

(3)一个结构体的大小可以根据sizeof(struct type)确定。C编译器将计算该结构体的总字节数大小。由于内存排列受限制,C编译器可能会用额外字节填充结构体的某些字段。如果需要,用户可以用PACKED属性定义C语言结构体。

(4)假设“NODE x , y"为两个相同类型的结构体,除了复制粘贴,还可以通过C语句y=x 将 x 分配给 y ;

(5)C语言联合体与结构体类似。要定义一个联合体,只需要将关键字 struct 替换成关键字union

编程项目:Unix/Linux文件系统树模拟器

文件树通常是上下颠倒的,根节点在上面。

为了安全起见,假设文件系统只包括目录(DIR)和常规文件(FILE),即没有特殊文件,这些文件是I/O设备。

在Linux文件系统中,每个节点都由表单 /a/b/c 或 a/b/c的唯一路径名表示。以“/"开头表示绝对路径,说明从根开始,否则为相对于当前工作目录(CWD)的相对路径。

命令规范

mkdir 路径名:为给定的路径名创建一个新目录

rmdir 路径名:如果目录为空,则删除该目录

creat 路径名:创建一个FILE结点

rm路径名:删除一个FILE节点

save 文件名:将当前文件系统树保存为文件

reload 文件名:从一个文件构造一个文件系统树

menu:显示有效命令菜单

quit:保存文件系统树,然后终止程序

标签:文件,二章,读书笔记,C语言,Unix,sh,Linux,进程,out
From: https://www.cnblogs.com/huang-ruoqi/p/16655340.html

相关文章

  • 《Unix/Linux系统编程》第1,2章学习笔记 20201209戴骏
    一.知识点归纳第一章引言1.本书目标编程背景知识详细介绍了程序开发步骤,包括汇报器、编译器、链接器等。动态数据结构的应用字符串标记化、搜索树节点、插入和......
  • 《Java编程思想》读书笔记(四)
    前言:三年之前就买了《Java编程思想》这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十七章到第十......
  • 第一二章学习心得
    一、笔记  第一章是书的引言部分,介绍了书的范围、Unix的历史、如何将UbuntuLinux同时安装到MicrosoftWindows中的virtual虚拟机和VMware虚拟机上。还简单提到了unix......
  • 教材第一章读书笔记
    教材第一章读书笔记by20201321周慧琳学习目标第一章:引言第一章的引言部分包涵Unix的历史、Linux的开发和各种版本(没有提及centOS和openeuler,我们可以自己补充学习),还......
  • 第二章-数据绑定
    快速了解RazorBlazor是Browser+Razor的组合(具有很大的艺术自由度)。因此,要了解Blazor,我们需要了解浏览器和Razor语言。我假设您了解什么是浏览器,因为互联网已经......
  • linux教材一、二章 练习及遇到的问题解决过程
      暑假期间我将VMware的ubuntu虚拟机重新装载了(之前崩了),并每天在终端练习运行命令行。开学后当我又重新打开ubuntu时,发现又出现了问题,如下图所示:     提示......
  • 第十二章-DI容器和DI容器介绍
    DI容器本书的先前部分是关于一起定义DI的各种原理和模式的。如第3章所述,DI容器是一个可选工具,可用于实现许多通用基础结构,如果使用PureDI,则必须实现这些基础结构。在整......
  • 《Java编程思想》读书笔记(四)
    前言:三年之前就买了《Java编程思想》这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十七章到第十......
  • Unix环境高级编程
     1.acct是一个工具包,里面包含有​针对用户连接时间、进程执行情况等进行统计​的工具。它可以​记录用户登录信息。用户所执行的程序,程序执行情况信息​等。acct包含以......
  • 4-《从零开始构建企业级推荐系统》读书笔记
    第1章推荐系统的时代背景为什么需要推荐系统流量利用长尾挖掘用户体验技术储备推荐什么东西只要是具有非普适性特点的东西,就可以用来做推荐,将其个性化推荐......