zoukankan      html  css  js  c++  java
  • 20191226刘煊赫学习笔记

    一、知识点归纳

    第一章:引言

    1. 系统编程课程的目的:

    (1)教授学生计算机系统软件方面的广博知识以及高级编程技巧,使其能够与操作系统内核交互,从而有效利用系统资源来开发应用软件;

    (2)为学生打下扎实的专业基础,以便在操作系统、嵌入式系统、数据库系统、数据库系统、数据挖掘、人工智能、计算机网络、网络安全、分布式和并行计算等计算机科学/工程领域继续深造。

    1. 系统编程的作用

       系统编程是计算机科学和计算机工程教育不可或缺的一部分。

    1. 关于Unix

       概念:Unix是一种通用操作系统,诞生于20世纪70年代早期,由肯·汤姆森和丹尼斯·里奇开发。

       分类:AT&T UnixBerkeley UnixHP UnixIBM UnixSun Unix

       下面是对各种Unix系统的介绍:

    名称

    介绍

    总结

     

     

    AT&T Unix

    20世纪80年代末,由美国电话电报公司开发,最终发布了AT&T System V UnixSystem V Unix是一个单处理器系统,在20世纪80年代后期,该系统被拓展为多处理器版本。

    可以看出,大多数Unix系统都是专有的,并且与特定的硬件平台相关联。

     

     

    Berkeley Unix

    1977年至1985年间由加州大学伯克利分校的伯克利软件发行中心开发的一组Unix操作系统变体。BSD Unix最重要的贡献是实现了TCP/IP协议族和套接字接口,作为一种标准的组网方式。

     

     

    HP Unix

    由惠普公司开发的专有Unix操作系统,第一版发布于1984年。HP-UX的独特功能包括可代替Unix标准rwx文件权限的用于大型文件系统和访问控制表的内置逻辑卷管理器。

     

     

    IBM Unix

    AIXIBM为其多个计算机平台开发的一系列专有Unix操作系统。AIX最初是为IBM 6150 RISC工作站而开发,现可支持各种硬件平台。

     

     

     

    Sun Unix

    最初是Sun公司开发的一款Unix操作系统。自20101月起,该系统更名为Oracle SolarisSolaris以其可拓展性而闻名,特别是在SPARC系统上。它支持由Oracle和其他供应商提供的各种基于SPARC和基于x86的工作站和服务器。

    1. 关于Linux

       定义:Linux是一个类Unix系统。它最初是林纳斯·托瓦兹在1991年为基于Intel x86的个人计算机开发的一个实验性内核。Linux的一个重要里程碑发生在20世纪90年代末,当时,它与GUN相结合,纳入了许多GUN软件,如GCC编辑器、GNU emacs编辑器和bash等,极大地促进了Linux的进一步发展。 Linux包含其他Unix系统的许多特性。在某种意义上,它是由各种最为流行的Unix系统组合而成。在很大程度上,Linux是兼容POSIX标准的。

       版本:Debian LinuxUbuntu LinuxLinux Mint、基于RPMLinuxSlackware Linux

       下面是对各类Linux系统的介绍:

    名称

    介绍

     

    Debian Linux

    Debian是专注于免费软件的Linux发行版,可支持很多软件平台。Debian发行版采用.deb包格式和dgpk包管理器及其前端。

     

    Ubuntu Linux

    Ubuntu是基于DebianLinux发行版,有多个官方发行版。

     

    Linux Mint

    Linux Mint是基于Debian Ubuntu的社区主导型Linux发行版。

     

    基于RPMLinux

    Red Hat LinuxSUSE Linux 是最早使用RPM文件格式的主要发行版,目前仍有一些软件包管理系统在使用这些格式。

     

    Slackware Linux

    Slackware Linux发行版以高度可定制而著称,专注于通过尖端的软件和自动化工具来提供维护便捷性和可靠性。

       

    1. Linux使用

    (1)Linux内核映像

            在典型的Linux系统中,Linux内核映像位于/boot目录中。可启动的Linux内核映像名为 vmlinuz-generic-VERSION_NUMBERinitrdLinux内核的初始ramdisk映像。一个可启动的Linux内核的初始ramdisk映像。

            一个可启用的Linux内核映像由三部分组成:|BOOT|SETUP|linux kernel|

    1. Unix/Linux文件系统组织

       Unix/Linux文件系统采用树形组织结构

    文件类型分为两种,分别是目录文件以及非目录文件,非目录文件、符号链接文件。

       目录文件:一个目录可能包含其他目录和(非目录)文件。

       非目录文件:非目录文件可以进一步划分为常规文件、特殊文件(字符特殊文件、块特殊文件)。

    (1)常规文件:包含普通文本或包含可执行的二进制代码。

    (2)特殊文件:特殊文件时/dev目录中的条目。

    符号链接文件:属于常规文件,其内容为其他文件的路径名。因此,这些文件是指向其他文件的指针。例如,Linux命令  ln -s aVeryLongFileName myLink,可创建一个符号链接文件“myLink”,指向“aVeryLongFileName”。

    Unix/Linux文件系统树的根节点(用“/”符号表示)称为根目录,或简称为根。文件系统树的每个结点都有以下表单的路径名指定:

    /a/b/c/d OR a/b/c/d

    “/”开头的路径名为绝对路径名,反之则为相对于进程当前工作目录(CWD)的相对路径名。

    pwd可以打印CWD的绝对路径名

    1. Unix/Linux命令

       下面列出了Unix/Linux中最常用的命令:

        lsls dirname:列出CWD或目录的内容

    cd dirname:更改目录

    pwd:打印CWD的绝对路径名

    touch filename:更改文件名时间戳(如果文件不存在,则创建文件)

    cat filename:显示文件内容

    cp src dest:复制文件

    mv src dest:移动或重命名文件。

    mkdir dirname:创建目录

    rmdir dirname:移除(空)目录

    rm filename:移除或删除文件

    ln oldfile newfile:在文件之间创建链接

    find:搜索文件

    grep:搜索文件中包含模式的行

    ssh:登录到远程主机

    gzip filename:将文件压缩为.gz文件。

    gunzip file.gz:解压.gz文件

    tar -zcvf file.tgz .:从当前目录创建压缩tar文件

    tar -zxvf file.tgz:从.tgz文件中解压文件

    man:显示在线手册页

    zip file.zip filenames:讲问价压缩为.zip文件

    unzip file.zip:解压.zip文件

    1. Linux手册页

        

    9.  Ubuntu Linux系统管理

    (1)用户账户:当用户使用登录名和密码登录后,登录进程将通过获取用户的giduid来转换成用户进程,并将目录更改为用户的homeDir,然后执行列出的initialProgram,该程序通常为命令解释程序sh

    (2)sudo命令:在Ubuntu里,sudo(“超级用户执行”)允许用户以另一个用户(通常是超级用户)的身份执行命令,为确保用户能够发出sudo,只需在sudoers文件中添加一行:username ALLALLALL

    第二章:编程背景

    1. Linux中的文本编辑器

    (1)Vim

         VimLinux的标准内置编辑器。它是Unix原始默认vi编辑器的改进版本。与其他大多数编辑器不同,vim3种不同的操作模式,分别是命令模式、插入模式、末行模式。

    下面介绍一下这三种模式:

    命令模式:用于输入命令

    插入模式:用于输入和编辑文本

    末行模式:用于保存文件并退出

    移动光标的命令键:

    h 左移一个字符 l:右移一个字符

    j:下移 k:上移

    插入模式:

    i:插入文本 a:追加文本 esc:退出

    输入“:”进入末行模式,将文本保存为文件或退出vim:

    :w:写入(保存)文件

    :q:退出vim

    :wq:保存并退出

    :q!:不保存更改,强制退出

    (2)WYSIWYG编辑器

         

        

    1. 使用文本编辑器

    1)emacs

           emacs是一款强大的文本编辑器,可在多个不同的平台上运行。最受欢迎的emacs是GNU Emacs,可在大多数Linux发行版中使用。

    3.程序开发

    程序开发步骤:

    执行程序的开发步骤如下:

    (1)创建源文件:使用文本编辑器创建一个或多个程序源文件。在系统编程中,最重要的编程语言是C语言和编程语言。C语言程序中的变量可分为全局变量、局部变量、静态变量、自动变量和寄存器变量。

    (2)gcc把源文件转换成二进制可执行文件,如:gcc t1.c t2.c 生成一个二进制可执行文件,文件名为a.out。在Linux中,cc链接到gcc,所以它们是一样的。

    (3)gcc是什么?gcc是一个程序,它包含三个主要步骤,如图所示

         

    第一步:将C源文件转换为汇编代码文件。

    第二步:把汇编代码转换成目标代码。

    第三步:链接。一个程序可能包含多个.o文件,这些文件相互依赖。

          可执行文件格式:

            虽然默认的二进制可执行文件名为a.out,但实际文件格式可变。其中包括

    (1)二进制可执行平面文件

    (2)a.out可执行文件

    (3)ELF可执行文件(更适合动态链接)

            a.out文件的内容:

            (1)二进制可执行平面文件

            (2)代码段

            (3)数据段

            (4)符号表

            

           程序执行过程:

    1)读取a.out文件头,以确定所需的总内存大小,包含栈空间大小:

    TotalSize = _brk +stackSize

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

    3)sh放弃旧映像,开始执行新映像

    4)执行从crt0.o开始,调用main()

    程序终止:

    (1)正常终止

    (2)异常终止

    4.C语言中的函数调用

      1)每个CPU都有以下寄存器或同等寄存器,括号中的条目表示x86CPU的寄存器:

    PC(IP):指向CPU要执行的下一条指令。

    SP(SP):指向栈顶

    FP(BP):指向当前激活函数的栈帧

    返回值寄存器(AX):函数返回值的寄存器。

    sub()执行C语句return x+y+u+v时,他对表达式求值,并将结果值放入返回寄存器(AX)。

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

    (1)汇编代码说明

           GCC生成的汇编代码由三部分组成:

           ①入口代码:又叫作prolog,它建立栈帧,在堆栈上分配局部变量和工作空间

           ②函数体代码:在AX寄存器中执行带有返回值的函数任务

           ③退出代码:又叫做epilog,它释放堆栈空间并返回到调用者

    1. 链接库

      Linux中,有两种链接库:用于静态链接的静态链接库和用于动态链接的动态链接库。

      静态链接库:

    在编译链接过程中,-L指定链接库路径(当前目录),-l指定链接库。注意,链接库(mylib)未指定前缀lib和后缀.a。

    动态链接库:

      

    1. Makefile

    (1) makefile格式:一个make文件由一系列目标项、依赖项和规则组成

    1. GDB调试工具

      1、创建makefile:

    t: t.c

    gcc -g -o t t.c

    然后使用RMACS编辑c语言源文件。

    2、编译源代码

    打开Tools菜单,选择编译或

    gccc -g -o t t.c

    3、启动GDB

    4、多窗口GDB

    5、附加GDB命令

      C语言程序中的常见错误:

        1、使用任何指针时,程序员必须确保指针部位NULL或被设置为执行有效的内存地址

    2、数组下标越界

    3、字符串指针和char数组使用不当

    4assert宏的用法

    1. C语言结构体

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

       key:一个整数

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

    1)定义结构体变量

    struct node x,node;

    NODE x,node;

    (2) typedef struct node{

    struct node *next;

    int key key;

    char name[2];

    }attribute((packed,aligned(1))) NODE;

    PACKED属性定义C语言结构体,这可以防止C编译器用额外字节填充字段

    3)联合体所有成员共享相同的存储区。

    4)可扩充C语言结构体:要使用这类结构体,用户必须为实际结构体分配所需要的内存。

    10.链表处理

    单向链表是一种由一系列节点组成的数据结构

    链表操作:

    链表最常见的操作类型为:构建、遍历、搜索、插入、删除、重新排序

    1. 树和Linux

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

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

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

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

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

    menu:显示有效命令菜单

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

  • 相关阅读:
    DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布
    C# 与 .NET Framework 对应关系
    C# 基于Directshow.Net lib库 USB摄像头使用DirectShow.NET获取摄像头视频流
    Actor模型的状态(State)+行为(Behavior)+邮箱(Mailbox)
    c# 无法加载DLL:找不到指定的模块(异常来自HRESULT:0X8007007E)
    管道式编程(Pipeline Style programming)
    Word文档转Markdown插件(Windows)
    纯Java实现定时任务(转)
    Spring MVC使用Schedule实现定时任务
    Spring Boot使用Schedule实现定时任务
  • 原文地址:https://www.cnblogs.com/lxhs/p/15269862.html
Copyright © 2011-2022 走看看