目录 第1章Linux C语言程序设计/1 1.1C语言/1 1.1.1C语言简介/1 1.1.2C语言的发展历史/2 1.1.3C语言的特点/2 1.2Linux概述/3 1.3Linux C语言程序设计简介/4 1.3.1Linux应用编程、系统编程和内核编程/4 1.3.2Linux图形界面编程/4 1.4Linux C语言编程环境/5 1.4.1Ubuntu Linux虚拟机/5 1.4.2gedit、vim和nano/5 1.4.3C语言编译器及集成开发环境/6 1.4.4Hello World程序/6 1.5习题/7 第2章C语言基础Ⅰ/9 2.1数据/9 2.1.1数据类型/9 2.1.2常量/11 2.1.3变量和标识符/13 2.1.4数据类型转换/14 2.1.5转义字符(转义序列)/15 2.2运算符/16 2.2.1运算符和表达式/16 2.2.2算术运算/18 2.2.3赋值运算/18 2.2.4关系运算/19 2.2.5逻辑运算符/19 2.2.6条件运算符/20 2.2.7逗号运算符/20 2.2.8sizeof运算符与typedef类型声明/21 2.2.9位运算/21 2.2.10复合赋值运算符/22 2.3结构化程序设计/23 2.3.1顺序结构/23 2.3.2分支结构/24 2.3.3循环结构/26 2.4输入/输出/29 2.4.1标准输出函数printf/30 2.4.2标准输入函数scanf/32 2.5数组/34 2.5.1一维数组/34 2.5.2二维数组/35 2.5.3一维字符数组/36 2.5.4一维字符数组的输入/输出/36 2.5.5字符串处理函数/37 2.5.6二维字符数组/39 2.6习题/40 第3章C语言基础II/44 3.1函数/44 3.1.1C语言库函数/44 3.1.2函数定义和声明/44 3.1.3函数调用及参数传递/46 3.1.4函数的嵌套与递归/49 3.1.5回调函数/50 3.1.6return语句/50 3.1.7全局变量、局部变量和作用域/51 3.1.8变量的存储类别及生存期/52 3.1.9内部函数和外部函数/54 3.2预处理/54 3.2.1预处理的步骤/54 3.2.2宏定义和内联函数/55 3.2.3条件编译/57 3.2.4文件包含/57 3.3指针/58 3.3.1指针的基本运算/58 3.3.2指针与数组/61 3.3.3指针与const限定符/64 3.3.4指针与字符串/65 3.3.5指针函数与函数指针/65 3.3.6再讲回调函数/66 3.3.7可变参数/67 3.3.8二级指针与多级指针/68 3.3.9指针数组和数组指针/69 3.3.10动态内存管理/70 3.4结构体、共用体和枚举/71 3.4.1结构体/71 3.4.2位域/72 3.4.3共用体/73 3.4.4枚举/74 3.5零长数组、变长数组和动态数组/75 3.6编码风格与缩进工具indent/77 3.7习题/79 第4章编译与调试/82 4.1gcc、make、Makefile、cmake和CMakeLists.txt/82 4.1.1gcc/82 4.1.2make和Makefile/84 4.1.3cmake和CMakeLists.txt/90 4.2完整的编译过程/90 4.3调试程序/92 4.3.1调试(Debug)和GDB/92 4.3.2测试用例/93 4.3.3GDB启动程序/93 4.3.4断点/94 4.3.5观察点/95 4.3.6捕捉点/96 4.3.7信号/96 4.3.8单步调试/97 4.3.9打印输出/97 4.3.10函数栈帧/99 4.3.11TUI窗口/100 4.3.12函数跳转/101 4.3.13段错误/101 4.3.14coredump/101 4.3.15调试正在运行的程序/102 4.3.16调试多进程和多线程/103 4.3.17gdb使用示例/105 4.4习题/105 第5章链表/107 5.1单向链表/107 5.1.1单链表结构与链表结点类型/107 5.1.2创建单链表/108 5.1.3插入结点/109 5.1.4删除结点/109 5.1.5读取结点/110 5.1.6查找结点/110 5.1.7打印单链表/110 5.1.8逆转单链表/111 5.1.9构建单向循环链表/111 5.1.10销毁单链表/112 5.1.11主函数及测试结果/112 5.2双向链表/113 5.2.1双链表结构与链表结点类型/113 5.2.2创建双链表/113 5.2.3插入结点/115 5.2.4删除结点/115 5.2.5读取结点/116 5.2.6查找结点/116 5.2.7打印双链表/116 5.2.8逆转双链表/117 5.2.9构建双向循环链表/117 5.2.10销毁双向循环链表/118 5.2.11主函数及测试结果/118 5.3内核链表/119 5.3.1list_head/119 5.3.2offsetof、container_of和list_entry/120 5.3.3链表初始化/120 5.3.4插入结点/121 5.3.5删除结点/121 5.3.6替换结点/122 5.3.7移动结点/122 5.3.8判断函数/123 5.3.9合并结点/123 5.3.10遍历链表/124 5.3.11用户空间使用内核链表/124 5.4习题/125 第6章C标准库/127 6.1C语言标准和glibc/127 6.2标准输入/输出函数库/129 6.2.1fopen/fclose/130 6.2.2stdin/stdout/stderr/132 6.2.3errno与perror函数/132 6.2.4以字节为单位的I/O函数/133 6.2.5以字符串为单位的I/O函数/135 6.2.6以记录为单位的I/O函数/136 6.2.7格式化读写文件/137 6.2.8操作读写位置的函数/138 6.2.9FILE结构体及I/O缓冲区/140 6.3标准工具函数库/143 6.3.1动态内存分配与释放/144 6.3.2整数算术/145 6.3.3随机数/146 6.3.4数值字符串转换/147 6.3.5宽字符和多字节字符转换/148 6.4字符串处理函数库/152 6.4.1内存赋值/152 6.4.2取字符串的长度/153 6.4.3复制字符串/153 6.4.4比较字符串/154 6.4.5搜索字符串/155 6.4.6连接字符串/156 6.4.7分割字符串/157 6.4.8本地函数/158 6.5字符处理函数库/160 6.6数学函数库/161 6.7学生信息管理系统的设计与实现/163 6.7.1系统设计要求/163 6.7.2系统设计/163 6.7.3函数设计/164 6.7.4参考程序/165 6.7.5运行结果/168 6.8习题/168 第7章Linux系统调用/171 7.1C库函数和Linux系统调用/171 7.2Linux中使用系统调用的三种方法/173 7.2.1通过glibc封装的库函数/173 7.2.2使用syscall直接调用/173 7.2.3通过CPU指令调用/173 7.3Linux系统调用编程: 进程管理/174 7.4Linux系统调用编程: 进程间通信/177 7.5Linux系统调用编程: exec函数族/179 7.6Linux系统调用编程: 文件管理/181 7.7习题/188 第8章Socket编程/190 8.1Socket基本概念/190 8.1.1Socket是什么/190 8.1.2主机字节序与网络字节序/191 8.1.3Socket地址结构/192 8.1.4地址转换函数/194 8.1.5C/S架构/195 8.2Socket相关函数/196 8.2.1socket函数/196 8.2.2bind函数/196 8.2.3listen/connect函数/196 8.2.4accept函数/197 8.2.5网络I/O函数/198 8.2.6close函数/200 8.2.7getsockopt和setsockopt函数/200 8.2.8select函数/203 8.2.9poll函数/203 8.2.10epoll函数/204 8.3基于TCP的网络程序/205 8.3.1简单C/S应用程序的设计/206 8.3.2交互式C/S应用程序的设计/208 8.3.3简单聊天室应用程序的设计(select)/210 8.3.4聊天室应用程序的设计(select)/214 8.3.5简单C/S应用程序的设计(epoll)/219 8.4基于UDP的网络程序/221 8.4.1简单C/S应用程序的设计/221 8.4.2简单聊天室应用程序的设计/223 8.5原始套接字编程/225 8.6UNIX Domain Socket/227 8.7习题/230 第9章Linux函数库和进程地址空间/232 9.1静态库和共享库/232 9.2函数库的制作和使用/233 9.2.1静态库的制作和使用/234 9.2.2共享库的制作和使用/236 9.3显式链接共享库/239 9.4进程地址空间/241 9.4.132位系统的进程地址空间/241 9.4.264位系统的进程地址空间/244 9.4.3查看进程地址空间/245 9.4.4编程验证进程地址空间布局/249 9.5动态链接过程/250 9.5.1ELF文件格式/251 9.5.2加载解释器/252 9.5.3运行解释器/253 9.6习题/260 第10章Pthreads编程/261 10.1Pthreads概述/261 10.1.1Linux进程和线程/261 10.1.2Linux线程模型/262 10.1.3Pthreads简介/263 10.2Pthreads函数/263 10.2.1创建线程/263 10.2.2终止线程/264 10.2.3线程的结合和分离/265 10.2.4线程属性/268 10.2.5自动清理线程资源/273 10.2.6线程同步与互斥/274 10.3Pthreads编程示例/281 10.3.1读者写者/281 10.3.2生产者消费者/282 10.3.3哲学家就餐/283 10.4习题/285 第11章GTK图形界面编程/287 11.1GTK概述/287 11.2GLib概述/288 11.3信号和回调函数/295 11.4GTK控件/297 11.4.1非容器控件/297 11.4.2容器控件/297 11.5GTK图形界面编程/298 11.5.1Hello World/298 11.5.2GtkGrid/299 11.5.3Custom Drawing/301 11.5.4GtkBuilder创建界面/304 11.5.5Cambalache/306 11.6GTK图形界面聊天室/308 11.6.1聊天室服务器端/308 11.6.2聊天室客户端/311 11.6.3测试/316 11.7习题/317 第12章Linux内核编程/319 12.1Linux内核编程概念/319 12.2LKM编程: Hello World/320 12.2.1LKM签名验证/320 12.2.2Hello World模块的编写和运行/322 12.2.3模块参数和模块导出符号/324 12.3Linux驱动程序设计/327 12.3.1Linux驱动程序简介/327 12.3.2字符设备驱动程序/328 12.3.3虚拟网卡驱动程序/332 12.4习题/335 附录AASCII码表/337 附录B资源及学习网站/338 参考文献/339