Linux C语言程序设计(微课视频版)
主 编:张同光
出版单位:清华大学出版社
ISBN:
ISBN:
出版时间:2023.6
CIP:
内 容 简 介
本书以“学完C语言之后知道能做什么”为编写目标,共包括12章:Linux C语言程序设计简介、C语言基础I、C语言基础II、编译与调试、链表、C标准库、Linux系统调用、Socket编程、Linux函数库和进程地址空间、Pthreads编程、GTK图形界面编程、Linux内核编程。其中,C语言基础I、C语言基础II、C标准库与Linux系统调用为本书最基础最重要的4章,全面介绍了标准C的基本语法和Linux系统调用编程。其他章节告诉读者C语言具体能做什么。本书坚守“Talk is cheap, show me the code.”信条,通过正确无误的示例代码向读者展示C语言的具体用法。本书内容注重实用、结构清晰、图文并茂,力求做到使读者在兴趣中学习Linux C语言编程。
本书适合作为高等学校各专业的C语言程序设计课程教材,也可作为从事计算机相关工作的科技人员、计算机爱好者及各类自学人员的参考书。
前 言
C语言是目前最为流行的高级程序设计语言之一,是许多计算机专业人员和计算机爱好者学习程序设计的首选语言。但是,好多学过C语言的读者在学习C语言之前以及学习过程中经常会问:“学习C语言能做什么?”。学完C语言之后感慨道:“学完C语言之后仍然不知道能做什么”。其实,编者认为学习C语言有两个目标,第一、为学习其他编程语言打下坚实的基础。因为计算机编程语言都是相通的,学好C语言再学习其他高级程序设计语言会很容易。这也是好多C语言教材能够达到的目标。所以那些学完C语言之后仍然不知道能做什么的读者已经具备了计算机编程基础了。本书的第2、3、6、7章可以达到该目标。第二、真正使用C语言开发有实际意义的程序。这正是本书所追求的目标。希望使用C语言开发有实际意义的程序,就要清楚目前C语言的真正应用场景。目前市面上绝大多数操作系统都是用C语言编写的。很多基础软件,如编译器、数据库、虚拟机、多媒体库、图形库等,也都是用C语言实现的。很多流行的编程语言也是用C语言实现的,如Lua、Python脚本语言等。在嵌入式系统开发中,比如固件、BSP、内核驱动等,除了少量的汇编代码,大部分都是用C语言开发的。互联网中的好多服务器程序也是用C语言开发的。总之,在整个计算机软件世界中,C语言发挥着中流砥柱的作用。读者可能对Linux不熟悉,但是,Linux早已深刻影响着我们生活的方方面面,从超级计算机、巨型机,到手机(Android),再到各种家电和嵌入式设备,内部都运行着Linux。另外,Linux支撑起了整个因特网。C语言和Linux操作系统有着密不可分的血缘关系,因此本书的主要目标是帮助读者掌握基于Linux的各种软件的C语言开发方法。为读者以后步入广阔无垠的Linux世界打下坚实的基础。编者坚信Linux之父、天才程序员Linus Torvalds所说:“Talk is cheap, show me the code.”,本书所有示例代码都是正确无误的。考虑到有些读者之前没有接触过Linux操作系统,因此,读者可以根据本书的第一个视频安装Linux虚拟机,搭建好Linux C语言编程环境。
本书提供配套课件、教学大纲和习题参考答案等多种教学资源,还提供了94个教学视频,读者在学习的过程中,扫描教学视频二维码可以观看视频。
《Linux C语言程序设计(微课视频版)》
第1章 Linux C语言程序设计简介 1
1.1 C语言 1
1.1.1 C语言简介 1
1.1.2 C语言发展历史 1
1.1.3 C语言特点 2
1.2 Linux简介 3
1.3 Linux C语言程序设计 4
1.3.1 Linux应用编程、系统编程和内核编程 4
1.3.2 Linux图形界面编程 4
1.4 Linux C语言编程环境 4
1.4.1 Ubuntu Linux虚拟机 4
1.4.2 gedit、vim和nano 5
1.4.3 C语言编译器及集成开发环境 6
1.4.4 Hello World程序 6
1.5 习题 7
第2章 C语言基础I 1
2.1 数据 1
2.1.1 数据类型 1
2.1.2 常量 3
2.1.3 变量和标识符 4
2.1.4 数据类型转换 5
2.1.5 转义字符(转义序列) 7
2.2 运算符 8
2.2.1 运算符和表达式 8
2.2.2 算术运算 9
2.2.3 赋值运算 10
2.2.4 关系运算 10
2.2.5 逻辑运算符 11
2.2.6 条件运算符 11
2.2.7 逗号运算符 11
2.2.8 sizeof运算符与typedef类型声明 12
2.2.9 位运算 12
2.2.10 复合赋值运算符 13
2.3 结构化程序设计 14
2.3.1 顺序结构 14
2.3.2 分支结构 15
2.3.3 循环结构 16
2.4 输入输出 20
2.4.1 标准输出函数printf 20
2.4.2 标准输入函数scanf 22
2.5 数组 24
2.5.1 一维数组 24
2.5.2 二维数组 26
2.5.3 一维字符数组 26
2.5.4 一维字符数组的输入输出 27
2.5.5 字符串处理函数 27
2.5.6 二维字符数组 29
2.6 习题 29
第3章 C语言基础II 1
3.1 函数 1
3.1.1 C语言库函数 1
3.1.2 函数定义和声明 2
3.1.3 函数调用及参数传递 3
3.1.4 函数的嵌套与递归 6
3.1.5 回调函数 7
3.1.6 return语句 7
3.1.7 全局变量、局部变量和作用域 8
3.1.8 变量的存储类别及生存期 8
3.1.9 内部函数和外部函数 11
3.2 预处理 11
3.2.1 预处理的步骤 11
3.2.2 宏定义和内联函数 12
3.2.3 条件编译 13
3.2.4 文件包含 14
3.3 指针 15
3.3.1 指针的基本运算 15
3.3.2 指针与数组 18
3.3.3 指针与const限定符 21
3.3.4 指针与字符串 21
3.3.5 指针函数与函数指针 22
3.3.6 再讲回调函数 23
3.3.7 可变参数 24
3.3.8 二级指针与多级指针 25
3.3.9 指针数组和数组指针 26
3.3.10 动态内存管理 27
3.4 结构体、共用体和枚举 28
3.4.1 结构体 28
3.4.2 位域 29
3.4.3 共用体 30
3.4.4 枚举 31
3.5 零长数组、变长数组和动态数组 32
3.6 编码风格与缩进工具indent 34
3.7 习题 35
第4章 编译与调试 1
4.1 gcc、make、Makefile、cmake和CMakeLists.txt 1
4.1.1 gcc 1
4.1.2 make和Makefile 2
4.1.3 cmake和CMakeLists.txt 8
4.2 完整的编译过程 9
4.3 调试程序 10
4.3.1 调试(Debug)和GDB 10
4.3.2 测试用例 11
4.3.3 GDB启动程序 12
4.3.4 断点 13
4.3.5 观察点 14
4.3.6 捕捉点 15
4.3.7 信号 15
4.3.8 单步调试 15
4.3.9 打印输出 16
4.3.10 函数栈帧 18
4.3.11 TUI窗口 19
4.3.12 函数跳转 20
4.3.13 段错误 20
4.3.14 coredump 20
4.3.15 调试正在运行的程序 21
4.3.16 调试多进程和多线程 22
4.3.17 gdb使用示例 24
4.4 习题 24
第5章 链表 1
5.1 单向链表 1
5.1.1 单链表结构与链表结点类型 1
5.1.2 创建单链表 2
5.1.3 插入结点 3
5.1.4 删除结点 3
5.1.5 读取结点 4
5.1.6 查找结点 4
5.1.7 打印单链表 4
5.1.8 逆转单链表 5
5.1.9 构建单向循环链表 5
5.1.10 销毁单链表 6
5.1.11 主函数及测试结果 6
5.2 双向链表 7
5.2.1 双链表结构与链表结点类型 7
5.2.2 创建双链表 8
5.2.3 插入结点 9
5.2.4 删除结点 9
5.2.5 读取结点 10
5.2.6 查找结点 10
5.2.7 打印双链表 11
5.2.8 逆转双链表 11
5.2.9 构建双向循环链表 12
5.2.10 销毁双向循环链表 12
5.2.11 主函数及测试结果 13
5.3 内核链表 14
5.3.1 list_head 14
5.3.2 offsetof、container_of和list_entry 14
5.3.3 链表初始化 15
5.3.4 插入结点 16
5.3.5 删除结点 16
5.3.6 替换结点 17
5.3.7 移动结点 17
5.3.8 判断函数 17
5.3.9 合并结点 18
5.3.10 遍历链表 19
5.3.11 用户空间使用内核链表 19
5.4 习题 20
第6章 C标准库 1
6.1 C语言标准和glibc 1
6.2 标准输入输出函数库(stdio.h) 3
6.2.1 fopen/fclose 3
6.2.2 stdin/stdout/stderr 5
6.2.3 errno与perror函数 6
6.2.4 以字节为单位的I/O函数 7
6.2.5 以字符串为单位的I/O函数 9
6.2.6 以记录为单位的I/O函数 10
6.2.7 格式化读写文件 11
6.2.8 操作读写位置的函数 12
6.2.9 FILE结构体及I/O缓冲区 14
6.3 标准工具函数库(stdlib.h) 18
6.3.1 动态内存分配与释放 18
6.3.2 整数算术 20
6.3.3 随机数 20
6.3.4 数值字符串转换 21
6.3.5 宽字符和多字节字符转换 23
6.4 字符串处理函数库(string.h) 26
6.4.1 初始化字符串 26
6.4.2 取字符串的长度 27
6.4.3 复制字符串 27
6.4.4 比较字符串 28
6.4.5 搜索字符串 29
6.4.6 连接字符串 30
6.4.7 分割字符串 31
6.4.8 本地函数 32
6.5 字符处理函数库(ctype.h) 34
6.6 数学函数库(math.h) 35
6.7 学生信息管理系统的设计与实现 37
6.7.1 系统设计要求 37
6.7.2 系统设计 38
6.7.3 函数设计 38
6.7.4 参考程序 40
6.7.5 运行结果 43
6.8 习题 44
第7章 Linux系统调用 1
7.1 C库函数和Linux系统调用 1
7.2 Linux中使用系统调用的三种方法 2
7.2.1 通过glibc封装的库函数 2
7.2.2 使用syscall直接调用 3
7.2.3 通过CPU指令调用 3
7.3 Linux系统调用编程:进程管理 4
7.4 Linux系统调用编程:进程间通信 6
7.5 Linux系统调用编程:exec函数族 9
7.6 Linux系统调用编程:文件管理 12
7.7 习题 19
第8章 Socket编程 1
8.1 Socket基本概念 1
8.1.1 Socket是什么 1
8.1.2 网络字节序与主机字节序 2
8.1.3 Socket地址结构 3
8.1.4 地址转换函数 5
8.1.5 C/S架构 6
8.2 Socket相关函数 7
8.2.1 socket函数 7
8.2.2 bind函数 7
8.2.3 listen/connect函数 7
8.2.4 accept函数 8
8.2.5 网络I/O函数 9
8.2.6 close函数 11
8.2.7 getsockopt和setsockopt函数 11
8.2.8 select函数 13
8.2.9 poll函数 14
8.2.10 epoll函数 14
8.3 基于TCP协议的网络程序 16
8.3.1 简单C/S应用程序的设计 16
8.3.2 交互式C/S应用程序的设计 19
8.3.3 简单聊天室应用程序的设计(select) 21
8.3.4 聊天室应用程序的设计(select) 25
8.3.5 简单C/S应用程序的设计(epoll) 31
8.4 基于UDP协议的网络程序 33
8.4.1 简单C/S应用程序的设计 33
8.4.2 简单聊天室应用程序的设计 35
8.5 原始套接字编程 38
8.6 UNIX Domain Socket 41
8.7 习题 43
第9章 Linux函数库和进程地址空间 1
9.1 静态库和共享库 1
9.2 函数库的制作和使用 2
9.2.1 静态库的制作和使用 3
9.2.2 共享库的制作和使用 4
9.3 显式链接共享库 7
9.4 进程地址空间 9
9.4.1 32位系统的进程地址空间 10
9.4.2 64位系统的进程地址空间 13
9.4.3 查看进程地址空间 14
9.4.4 编程验证进程地址空间布局 17
9.5 动态链接过程 19
9.5.1 ELF文件格式 20
9.5.2 加载解释器 22
9.5.3 运行解释器 23
9.6 习题 29
第10章 Pthreads编程 1
10.1 Pthreads概述 1
10.1.1 Linux进程和线程 1
10.1.2 Linux线程模型 2
10.1.3 Pthreads概述 2
10.2 Pthreads函数 3
10.2.1 创建线程 3
10.2.2 终止线程 3
10.2.3 线程的结合和分离 4
10.2.4 线程属性 7
10.2.5 自动清理线程资源 13
10.2.6 线程同步与互斥 14
10.3 Pthreads编程示例 21
10.3.1 读者写者 21
10.3.2 生产者消费者 24
10.3.3 哲学家就餐 25
10.4 习题 27
第11章 GTK图形界面编程 1
11.1 GTK简介 1
11.2 GLib简介 2
11.3 信号和回调函数 7
11.4 GTK控件 9
11.4.1 非容器控件 9
11.4.2 容器控件 9
11.5 GTK图形界面编程 10
11.5.1 Hello World 10
11.5.2 GtkGrid 11
11.5.3 Custom Drawing 13
11.5.4 GtkBuilder创建界面 16
11.5.5 Cambalache 18
11.6 GTK图形界面聊天室 21
11.6.1 聊天室服务器端 21
11.6.2 聊天室客户端 25
11.6.3 测试 32
11.7 习题 34
第12章 Linux内核编程 1
12.1 Linux内核编程简介 1
12.2 LKM编程:Hello World 1
12.2.1 LKM签名验证 1
12.2.2 Hello World模块的编写和运行 3
12.2.3 模块参数和模块导出符号 6
12.3 Linux驱动程序设计 9
12.3.1 Linux驱动程序简介 9
12.3.2 字符设备驱动程序 10
12.3.3 虚拟网卡驱动程序 14
12.4 习题 18
附录1 ASCII码表
附录2 资源及学习网站
参考文献