《Unix/Linux系统编程》第一、二章学习笔记
第一章 引言
1、Unix&Linux简介及历史版本
2、虚拟机安装(VMware Workstation Pro)
3、Ubuntu和windows差别对比(个人总结,可能有误)
(1)从安全性角度而言,Ubuntu的超级用户root被锁定,而Windows很容易就启用超级用户。Ubuntu 很少成为病毒和恶意软件的目标。(sudo命令)。
(2)Ubuntu拥有远超Windows的个性化配置选择。
(3)Windows中数据被分散储存在多个地方,Ubuntu则把所有信息都储存在用户主目录下,方便备份和迁移数据。
4、Unix/Linux常用命令
ls:ls 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文件。
tar -zcvf file.tgz.:从当前目录创建压缩tar文件。
tar -zxvf file.tgz.:从.tgz文件中解压文件。
man:显示在线手册页。
zip file.zip filenames:将文件压缩为.zip文件。
unzip file.zip:解压.zip文件。
ln :创建链接文件
more、less:分页显示文本文件内容
head、tail : 显示文件头、尾内容
Ctrl+alt+t:打开命令行
ctrl+alt+F1:命令行全屏模式
5、Ubuntu Linux的系统管理
用户账户信息保存在/etc/passwd文件中,该文件归超级用户所有,但任何人都可以读取。在表单的/etc/passwd文件中,每个用户都有一个对应的记录行:loginName:x:gid:uid:usefInfo:homeDir:initalProgram。包含加密的用户密码,后面是可选的过期限制信息,如过期日期和时间等。当用户尝试使用登录名和密码登录时,Linux将检查/etc/passwd文件和/etc/shadow文件,以验证用户的身份。
添加用户命令sudo adduser username;
sudo命令,即超级用户执行,可提升用户权限至超级用户。
第二章 编程背景
1、Linux中的文本编辑器
(1)Vim
vim是Linux的标准内置编辑器。
vim有三种不同的操作模式,分别是命令模式、插入模式和末行模式。
命令模式:vim启动时,处于默认的命令模式。大多数键表示特殊命令。如操纵光标的上下左右分别为kjhl。
插入模式:当要输入文本进行编辑,必须输入i或a命令将vim切换到插入模式。其中i为插入文本,a命令为追加文本。要退出插入模式,按ESC键一次或多次即可。
末行模式:在命令模式下,输入“:”进入末行模式,将文本文件保存为文件或退出vim,具体有以下四个命令:
:w:写入(保存)文件
:q:退出vim
:wq:保存并退出
:q!:不保存更改,强制退出
(2)gedit&emacs
Gedit是GNOME桌面环境默认的文本编辑器。
Emacs则可在多个不同的平台下运行。
两者都属于所见即所得(WYSIWYG)编辑器,相对vim,不需要模式切换。
2、程序开发
(1)程序开发步骤
<1>创建源文件。
<2>用gcc将源文件转换为二进制可执行文件。文件名默认为a.out。
a.out文件的内容包含:
文件头:包含文件加载信息和大小,其中
tsize=代码段大小;
dsize=包含初始化全局变量和初始化静态局部变量的数据段大小;
bsize=包含未初始化全局变量和未初始化静态局部变量的bss段大小;
total_size=加载的a.out文件的总大小。
代码段:正文段,包含程序的可执行代码,调用main函数。
数据段:包含初始化全局变量和初始化静态数据。
符号段(可选):仅为运行调试所需。
(2)静态与动态链接
使用静态链接,则链接器将所有必要的库函数代码与数据纳入a.out文件中;
使用动态链接,则只将调用以指令形式记录。
相对比,静态链接的文件完整、独立,但偏大;动态链接文件偏小,且多个文件可共享库函数。在需要修改库函数时,动态链接也更方便。
(3)程序的执行与终止
程序的执行分为三步:
读取a.out文件头,确认所需的总内存和堆栈空间大小;
sh从总大小中分配一个内存区给执行映像;
sh放弃旧映像,开始执行新映像。
程序的终止分为两种:
<1>正常终止(执行成功)
<2>异常终止(遇到错误)
问题与解决:
1、linux c/c++ a.out的由来
a.out是”assembler output”的缩写格式,代表汇编程序输出。在较早版本的类unix系统中,a.out是一种输出格式,用于可执行文件,目标文件和共享库。早期的 PDP-7系统上没有链接器,程序的创建过程是先把所有源文件连接成一个文件,然后进行汇编,产生的汇编程序保存在a.out中。这样a.out是名副其实的汇编输出,但到PDP-11之后,人们为其编写了链接器,程序的创建是先编译然后链接输出保存到a.out中,这时a.out其实已经是链接输出了,但输出的可执行文件仍然延续这个命名习惯。
2、gcc的完整过程(如图)
3、gcc和g++的区别
1. gcc是GCC中的c编译器
g++是GCC中的c++编译器
2. 对于后缀为.c的文件,gcc当成c文件处理,而g++当成c++处理
对于后缀为.cpp的文件,两者都当成.cpp文件处理
3. 在编译阶段,g++会自动链接STL库,而gcc必须要加一个参数-lstdc++
4. gcc在编译c文件时,可用的预定义宏是比较少的