第一周读书笔记
第一章 引言
-
系统编程的作用:1)教授学生计算机系统软件方面的广博知识以及高级编程技巧 2)为学生打下坚实基础
-
学习目标:强化背景编程知识,学习动态数据结构的应用、进程概念及进程管理、并发编程、定时器和定时功能、信号、信号处理和进程间通信、文件系统、TCP/IP和网络编程
(什么是并发编程?并发编程的目的是为了提高程序的执行速度.但是并不意味着启动更多的线程会达到更好的并发效果,并发编程还会引起死锁 , 上下文频繁切换 , 线程不安全等问题,通俗理解就是时间统筹,在一件事发生的时候做其他事情效率最大化https://blog.csdn.net/cisco_huang/article/details/87104427)
-
关于Unix:一种通用操作系统,包含:AT&T Unix、Berkeley Unix、HP Unix 、IBM Unix、Sun Unix
关于Linux:是一个类Unix系统纳入了许多GNU软件,包含:Debian Linux、Ubuntu linux、Linux mint、基于RPM的Linux、Slackware Linux
(Linux和Unix系统的区别?Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。它能够在PC计算机上实现全部的Unix特性、全部功能,任何使用Unix操作系统或想要学习Unix操作系统的人都可以从Linux中获益。最大的区别是,前者是开发源代码的自由软件,而后者是对源代码实行知识产权保护的传统商业软件https://blog.csdn.net/preciousboy/article/details/5867382)
-
虚拟机:VirtualBox大一安装后没卸载,再点开已经不能用了,重复安装也不行,暂未找到解决方案所以下载了Vmware
VMware能正常使用
-
文件类型:目录文件、非目录文件、符号链接文件
-
以“/”开头的路径名为绝对路径名,反之则为相对于进程当前工作目录(CWD)的相对路径名
-
Linux/Unix常用命令:
cd:更改目录
exit:退出
logout:注销
sudo apt install:安装应用程序
sudo:使用root权限执行
ls:lsdirname:列出CWD或目录的内容
pwd:打印CWD的绝对路径名
touch filename:更改文件名时间戳(如果文件不存在,则创建文件)
cat filename:显示文件内容
cp src dest:复制文件
mv src dest:移动或重命名文件
mkdir dirname:创建目录
rmdir dirname:移除(空)目录
rm filename:移除或删除文件
find:搜素文件
grep:搜索文件中包含模式的行
ssh:登录到远程主机
tar-zcvffile.tgz:从当前目录创建压缩tar文件
tar-zxvffile.tgz:从tgz文件中解压文件
man:显示在线手册页
zip file.zip filenames:将文件压缩为.zip文件
unzip file.zip:解压.zip文件 -
sudo命令:sudo命令(超级用户执行)允许用户以另一个用户的身份执行命令
第二章 编程背景
-
vim:是Linux的标准内置编辑器,有三种不同操作模式:命令模式(用于输入命令)、插入模式(用于输入和编辑文本)、末行模式(用于保存文件并退出)
-
Vim使用键位图:
-
gedit:类似于Windows中的记事本,是一个简单的图形界面文本编辑器。
-
emacs:更加强大,具有更多功能的图形界面文本编辑器。
-
程序开发步骤:1)创建源文件 2)用gcc把源文件转换成二进制可执行文件
第一步:将c源文件转换为汇编代码.s文件
第二步:把汇编代码转换为目标代码.o文件,其中包含一个文件头,包含代码段、数据段和BSS段的大小,一个代码段,包含机器指令,一个数据段,包含初始化全局变量和初始化静态局部变量,一个BSS段,包含未初始化全局变量和未初始化静态局部变量,代码中的指针以及数据和BSS中偏移量的重定位信息,一个符号表,包含非静态全局变量、函数名称及其属性
第三步:链接。将.o文件所有代码组合成单一代码段—>将所有数据段组合成单一数据段—>将所有BSS段组合成单一BSS段—>用.o文件中的重定位信息调整组合代码段中的指针及其组合数据段、bss偏移量—>用符号来解析.o文件之间的交叉引用
-
C语言程序中的变量可分为全局变量(函数外定义)、局部变量(在函数内定义)、静态全局变量(仅对定义他们的文件可见)、非静态全局变量(对同一程序的所有文件都可见)、寄存器变量(分配到CPU寄存器中)、静态局部变量(永久性、唯一性、可初始化)、易失性变量(用作内存映射I/O的地址)
-
a.out文件的内容:文件头、代码段、数据段、符号表
-
程序执行过程:1)读取a.out文件头,以确定所需总内存大小,包括堆栈空间大小 2)sh从总大小分配一个内存区给执行映像 3)sh放弃旧映像,开始执行新映像 4)执行crt0.o开始,调用main()将argc和argv作为参数传递给main()
-
程序终止方法:正常终止(程序执行成功,系统清空该进程的结构体)异常终止:(程序无法正常执行,终端强制使进程终止)
-
静态链接库中-L.指定连接库路径(当前目录),-l指定链接库,动态链接库若不在当前目录中,只需更改-L.选项,设置LD_LIBRARY_PATH,以指向包含链接库的目录
-
makefile:用来管理和编译项目。makefile是一个文件,在使用make命令时,会读取这个文件并对项目按照文件内容进行编译。make文件由一系列目标项、依赖项、规则组成。
-
gdb断点设置指令总结:
(gdb)break 7 //以行号设置断点
(gdb)break function_name //以函数名设置断点
(gdb)clear 行号 //删除这行的断点
(gdb)clear 函数名 //删除该函数的断点
(gdb)delete breakpoints n //删除第n次(指定编号)设置的断点
(gdb)clear //删除程序中所有的基于行设置的断点
(gdb)delete //删除程序中所有的断点
(gdb)r //执行程序
(gdb)n //单步调试
(gdb)c //执行到下一个断点
(gdb)print 变量或表达式 //打印变量或表达式当前的值。
(gdb)print 变量=值 //对变量进行赋值
(gdb)whatis 变量或表达式 //显示变量类型
(gdb)set variable 变量=值 //变量赋值
-
链表:1)单链表:每个节点包含两部分,一部分存放数据变量的data,另一部分是指向下一节点的next指针
2)双向链表:除了包含单链表的部分,还增加的pre前一个节点的指针链表的优点在于,不需要连续的存储单元,修改链表的复杂度为O(1) (在不考虑查找时),但是缺点也很明显:无法直接找到指定节点,只能从头节点一步一步寻找复杂度为O(n) -
树:树的定义是递归的,是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,具有以下
两个特点:1)树的根结点没有前驱结点,除根结点之外的所有结点有且只有一个前驱结点。 2)树中所有结点可以有零个或多个后继结点。
-
代码:伪代码 (注释和描述)产品代码 (函数、模块)(没有main) xx.c->xx.测试代码 (有main)
代码及实践
- mkdir + src/docs/include/libs/bin 生成树
xx.out文件放入bin,xx.md文件放入xx.h,xx.h文件放入include,xx.o文件放入libs,xx.c文件放入src
test.c代码:
hello.c代码:
运行结果:
成功! - 过程:
1)在src中创建编写hello.c和test.c
2)输入gcc src/hello.c -o bin/hello.out将生成的hello.out文件生成到bin中(hello.o文件同样操作,将命令的out改为o即可)
3)输入gcc -Iinclude -c src/hello.c -o libs/hello.o将源文件编译为库文件
4)输入gcc src/test.c libs/hello.o -Iinclude -o bin/hello生成可执行文件
5)运行hello,成功