《Unix/linux系统编程》教材第1、2章学习笔记
第1章:引 言
关于本书
是研究Unix/Linux系统编程的专著。其中涵盖Unix/Linux的所有基本组件,包括进程管理、并发编程、定时器和时钟服务、文件系统、网络编程和MySQL数据库系统。
关于Unix
Unix是一种通用型操作系统,采用PDP-11微型计算机开发,有许多个版本。
- AT&T Unix
- Berkeley Unix
- HP Unix
- IBM Unix
- Sun Unix
关于Linux
Linux是一个类Unix开源系统,最初由李纳斯基于Intel x86的个人计算机开发的一个实验性内核,目前也存在多个版本。
- Debian Linux
- Ubuntu Linux
- Linux Mint
- 基于RPM的Linux
- Slackware Linux
虚拟机上的Linux
在Microsoft Windows 10内的虚拟机上安装并运行Linux
- VirtualBox
- 安装教程
- 调整屏幕分辨率:
按照教材内容打开终端,输入命令行xdiagnose
,发现要先下载,下载时候出现下图问题
通过向gpt提问发现是有另一个软件包管理器正在运行,执行sudo fuser -vki /var/lib/dpkg/lock
命令关闭进程后解决
再次使用sudo xdiagnose
,按照下图选择即可改变分辨率
3.在Ubuntu下测试C语言
使用sudo apt-get install emacs
安装emacs
- VMware
使用 Ubuntu Linux
- Ctrl+ALT+T组合键打开伪终端
- 用户为普通用户,要运行任何特权命令,用户必须输入
sudo command
- 为了在当前目录下运行程序,用户每次都必须输入
./a.out
- 一般安装的Linux版本为64位,若需要生成32位需要使用
gcc -m32 t.c # compile t.c into 32-bit code
文件系统组织
-
采用树形组织结构
-
文件路径名
文件系统数树的根节点(用“/”表示)称为根目录,文件系统树的每个节点都由以下的路径名指定:
/a/b/c/d or a/b/c/d
以“/”开头的为绝对路径名,反之则为相对于进程当前工作目录(CWD)的相对路径名。登录时,CWD被设置为主目录。CWD可以通过cd命令更改。pwd可以打印CWD的绝对路径名。 -
常用命令
ls:ls dirname:列出CWD或者目录内容
cd dirname:跳转目录
pwd:打印绝对路径
touch file:改变文件名时间戳(如果文件不存在,则创建文件)
cat file:显示文件内容
cp src dest:复制文件
mv src dest:移动或重命名文件
mkdir dir:创建目录
rmdir dir:删除(空)目录
rm file:删除文件
ln old new:链接文件
find:搜索文件
grep:搜索包含
ssh:远处登录主机``
gzip file:压缩为.gz
gunzip file.gz:解压.gz
tar -zcvf file.tgz .:从当前目录创建压缩tar
tar -zxvf file.tgz .:从.tgz文件中解压文件
man:手册(man command)
zip file.zip file:将文件压缩为.zip文件
unzip file.zip:解压.zip文件 -
Linux手册
在Ubuntu Linux中保存在/usr/share/man/目录下,使用手册页例子:
man ls:显示man1中ls命令的手册页
man 2 open:显示man2中open函数的手册页
Ubuntu Linux系统管理
-
添加新用户
sudo adduer username
-
sudo命令
在sudoers中添加username ALL(ALL) ALL
来确保用户能够发出sudo
第2章:编程背景
Linux文本编辑器
- vim
vim启动时处于命令模式,输入
i:切换到插入如模式,插入文本
a:切换到插入模式,追加文本
退出插入模式按ESC一次或多次。
在命令模式下,输入“:”进入末行模式,将文本保存为文件或者退出vim:
:w:写入(保存)文件
:q:退出vim
:q!:不保存更改,强制退出
2.gedit
是GNOME桌面环境默认的文本编辑器(包括ununtu)。
3.emacs
强大,apt-get install emacs
下载。
程序开发
-
程序开发步骤
1.创建源文件
注释:“/”和“/”或者“//”
变量:全局变量、局部变量、静态变量(可以初始化)、自动变量和寄存器变量。
2.用gcc把源文件转换为二进制文件
3.gcc是什么
是一个程序,包含3步:
第一步:将C源代码文件转换为汇编代码文件,.c转为.s
第二步:把汇编代码转换为目标代码,.s转为.o
第三步:链接,调用链接器将所有.o文件和必要的库函数组合成单一的二进制可执行文件。 -
静态与动态链接
创建二进制文件的两种形式
动态链接:可减小每个a.out文件的大小;许多程序可以共享库函数。 -
a.out文件内容
1.文件头
2.代码段:也称正文段
3.数据段
4.符号表
C语言中的函数调用
- 64位GCC中的运行时堆栈使用情况
与32有一些不同,调用函数时,前六个参数依次进入rdi、rsi、rdx、rcx、r8、r9,其他任何参数通过堆栈。进入后先建立栈帧(rbp),肯呢个向下移动堆栈指针(rsp)。GCC编译生成的代码可保持堆栈指针固定不懂,默认保留红色区域堆栈128字节。
C语言程序与汇编代码的链接
- 汇编代码说明
GCC生成的汇编代码由三部分组成:
1.入口代码:prolog
2.函数体代码:
3.退出代码:epilog
链接库
- 静态链接库
gcc -c mysum.c
ar rcs libmylib.a mysum.o
gcc -static t.c -L. -lmylib
a.out
-L.指定链接库路径,-l指定链接库
- 动态链接库
gcc -c -fPIC mysum.c
gcc -shared -o libmylib.so mysum.o
gcc t.c -L. -lmylib
export LD_LIBRARY_PATH=./
a.out
如果链接库不在当前目录中,只需要更改-L.选项。
makefile
-
格式
一个make文件由一系列目标项、依赖项和项目组成。 -
make程序
通常,我们会使用sh命令
gcc -o myt main.c mysum.c
生成一个名为myt的二进制可执行文件。
GDB调试工具
- 在emacs IDE中使用GDB
- 源代码:
在X-window下打开一个伪终端,使用EMACS创建makefile
t:t.c
gcc -g -o t t.c
- 编译源代码:
打开EMACS的Tools菜单,然后选择Compile。EMACS将在编辑窗口底部显示一个提示行
make -k
并等待响应 - 启动GDB:
打开tools菜单并选择Debugger,底部会显示提示行
gdb -i=mi t
并等待响应,按enter键启动GDB调试工具 - 多窗口GBD:
从GDB菜单中,选择Gud->GDB-MI->Display Other Windows,GBD将在不同的窗口中显示GDB缓冲区。
学习过程中的问题和解决过程
问题及其解决过程已展示在上示总结中。
针对知识点与gpt的对话
-
vim文本编辑器
-
C语言程序与汇编代码的链接
程序实现与代码
hello.c:
#include "hello.h"
void ljx()
{
printf("hello!\n");
}
main.c:
#include "hello.h"
int main(){
ljx();
}
hello.h:
#ifndef ___HELLO_H___
#define ___HELLO_H___
void ljx();
#endif
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~