一、知识点归纳以及自己最有收获的内容
1、知识点归纳
第1章 引言
1、 系统编程的作用——有效利用系统资源来开发应用软件;为学生打下扎实的专业基础
2、 本书目标
- 强化学生的编程背景知识
- 动态数据结构的应用
- 进程概念和进程管理
- 并发编程
- 定时器和定时功能
- 信号、信号处理和进程间的通信
- 文件系统
- TCP/IP和网络编程
3、Unix
- AT&T Unix
- Berkeley Unix
- HP Unix
- IBM Unix
- Sun Unix
大多数Unix系统都是专有的,并且与特定的硬件平台相关联。普通人可能无法访问这些系统。因此我们使用Linux作为编程练习和实践的平台。
4、Linux
- Debian Linux
- Ubuntu Linux
- Linux Mint
- 基于RPM的Linux
- Slackware Linux
5、在Microsoft Windows 10内的虚拟机上安装和运行Linux
- 下载安装VirtualBox
- 创建VirtualBox虚拟机
- 下载镜像ubuntu20.04
- 将Ubuntu 14.04安装到Virtualbox VM上
- 调整屏幕分辨率
在ubuntu下测试C语言编程放在实践部分
本学期我主要使用VitualBox,VMware、双启动Slackware和Ubuntu Linux就只是进行一个简单的了解
6、Unix/Linux文件系统组织:文件类型有目录文件、非目录文件(常规文件和特殊文件(字符特殊文件与块特殊文件))、符号链接文件
7、Unix/Linux 命令
(1)ls:ls dirname列出CWD或目录的内容
(2)cd dirname:更改目录
(3)pwd:打印CWD的绝对路径名
(4)touch filename:更改文件名时间戳
(5)cat filename:显示文件内容
(6)cp src dest:复制文件
(7)mv src dest:移动或重命名文件
(8)mkdir dirname:创建目录
(9)rmdir dirname:移除(空)目录
(10)rm filename:移除或删除文件
(11)In oldfile newfile: 在文件之间创建链接
(12)find: 搜索文件
(13)grep: 搜索文件中包含模式的行
(14)ssh: 登录到远程主机
(15)gzip filename: 将文件压缩为.gz文件
(16)gunzip file.gz: 解压.gz文件
(17)tar-zcvf file.tgz.: 从当前目录创建压缩tar文件
(18)tar-zxvf file.tgz.: 从.tgz 文件中解压文件
(19)man: 显示在线手册页
(20)zip file.zip filenames: 将文件压缩为.zip文件
(21)unzip file.zip: 解压.zip文件
8、Ubuntu Linux系统管理
- 用户账户:当用户使用登录名和密码登录后,登录进程将通过获取用户的gid和uid来转换成用户进程,并将目录更改为用户的homeDir,然后执行列出的initialProgram,该程序通常为命令解释程序sh。
- sudo命令:在Ubuntu里,sudo(“超级用户执行”)允许用户以另一个用户(通常是超级用户)的身份执行命令,为确保用户能够发出sudo,只需在sudoers文件中添加一行:username ALL(ALL) ALL。
第2章 编程背景
1、Linux中的文本编辑器
- Vim
操作模式:命令模式、插入模式和末行模式
插入模式:i:插入文本
a:追加文本
末行模式: :w:写入文件
:q:退出vim
:wq:保存并退出
:q!:不保存更改,强制退出 - Gedit
GNOME桌面环境默认的文本编辑器 - Emacs
可在很多不同的平台上运行
2、程序开发
- 创建源文件:使用文本编辑器创建一个或多个程序源文件
C语言程序变量:全局变量、局部变量、静态变量、自动变量和寄存器变量 - 用gcc把源文件转换成二进制可执行文件
例:gcc t1.c t2.c
生成一个二进制可执行文件,文件名为a.out。 - gcc三大步骤:
①将C源文件转换为汇编代码文件
②把汇编代码转换成目标代码
③执行链接器:将.o文件的所有代码段组合成单一代码段,再将所有数据段组合成单一数据段,最后将所有BSS段组合成单一bss段,用.o文件中的重定位信息调整组合代码段中的指针以及组合数据段、bss段中的偏移量,便于用符号表来解析各个.o文件之间的交叉引用。
3、静态与动态链接
动态链接的优点:可减小每个a.out文件的大小;许多执行程序可在内存中共享相同的库函数;修改库函数不需要重新编译源文件。
4、可执行文件格式
- 二进制可执行平面文件;
- a.out可执行文件;(a.out文件的内容包括文件头、代码段、数据段和符号表)
- ELF可执行文件。
5、a.out文件的内容
- 文件头:
tsize=代码段大小
dsize=包含初始化全局变量和初始化静态局部变量的数据段大小
bsize=包含未初始化全局变量和未初始化静态局部变量的bss段的大小
total_size=加载的a.out文件的总大小 - 代码段
代码段从标准C启动代码crt0.o,该代码调用main()函数 - 数据段
数据段包含初始化全局变量和初始化静态数据 - 符号表
可选,仅运行调试所需
6、程序运行过程
- 读取a.out文件头
- sh从总大小中分配一个内存区给执行映像
- sh放弃旧映像,开始执行新映像
- 执行从crt0.o开始,调用main(),将argc和argv作为参数传递给main()
7、Makefile
格式:一个make文件由一系列目标项(创建或更新的文件,也可能是make程序要引用的指令或标签)、依赖项和规则(使用依赖项列表构建目标项所需的命令)组成。
8、GDB调试工具
9、C语言程序中的常见错误
- 未初始化的指针或含有错误值的指针
- 数组下标越界
- 字符串指针和char数组使用不当
- assert宏
- 在程序代码中使用fprintf()和getcharO :
编写C语言程序时,在程序代码的关键 位置输入fprintf(stderr, message)语句以显示预期结果通常很有用。由于stderr的fprintf() 无缓冲,因此打印的消息或结果将在执行下一个C语句之前立即显示。如果需要,程序员 还可以使用getchar()停止程序流程,从而允许用户在继续执行操作之前检查执行结果。
10、C语言结构体,链表处理,树均为数据结构内容。
自己最有收获的内容
自己按照教程完成了虚拟机的安装,虚拟机上ubuntu的安装,并在命令行中实现了第一章中提到的一些linux命令如
- man -a man 查看man指令所有用法;man ls 查看ls指令用法
- help -m help以类似于 man 手册格式查看 help 命令的帮助信息。
help help查看 help 自身的帮助信息 - 使用whatis指令查询 ls man clear 指令功能
- which 命令查看ls和man位置
- whereis命令用于查找文件
-b 只搜索二进制文件。
-m 只搜索手册文件。
-s 只搜索源文件。 - find 命令用来在指定目录下查找文件。不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。
- ls命令用来打印出目录的清单,通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。
- 执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。
- 语法为cd [dirName]其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。
- Linux mkdir(英文全拼:make directory)命令用于创建目录。
- Linux rmdir命令:删除空的目录。
- linux cat命令:用于连接文件并打印到标准输出设备上。
- Linux od命令用于输出文件内容。
od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。 - stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。
- Linux sort 命令用于将文本文件内容加以排序。
sort 可针对文本文件的内容,以行为单位来排序 - Linux diff命令用于比较文件的差异。diff并不会改变文件的内容,但是diff可以输出一个ed脚本来应用这些改变。
- Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。
uniq 可检查文本文件中重复出现的行列。 - vi 指令进入vi编辑器;
i进入编辑模式
esc退出编辑模式
:wq退出vi编辑器 - Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字。
- -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
- Linux split命令用于将一个文件分割成数个。
该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。
问题与解决思路
(1)如图,在安装虚拟机时因为unbuntu 还未安装完成无法调节分辨率且窗口无法拖动导致安装不能继续
解决思路:在网上查找类似情况后得知win+鼠标左键点击安装界面(注意不是visualbox窗口)可以拖动
(2)课本中C语言中的函数调用部分不理解
解决方法:第一遍阅读时感觉不知所云,但是当往后阅读到C语言程序与汇编代码的链接部分时突然意识到当时上计算机组成与设计这门课时学习的有关汇编代码中的递归、栈的运用时的相关知识,回头再看看C语言中的函数调用这一部分就感觉阅读起来轻松了许多,第二遍读时一边用笔在纸上写写画画,感觉变得好理解起来,指针这种抽象的东西最好还是写写画画最便于理解。
实践内容与截图
(1)Ubuntu下C语言程序编写与运行
- 安装gcc
- 创建一个新的C语言源文件
vim hello.c
打开vim界面后按i进入写入模式,然后写入代码
- 输入:wq保存并退出(可以使用wq!强制退出)进行编译、运行
(2)编写一个主程序文件mian.c和子程序文件sub.c - main.c
- sub.c
- 运行结果