学习C高级(二十)
学习C高级的方法
理解相关函数作用的前提下,用代码模板加深对相关概念的理解
以理解概念为主,以相关函数为辅
- 概念 ----- 更重要
- 相关函数 ----- 不用死记,会整理,会搜,
函数
学C语言时应该要同步掌握的C库函数:
- stdio.h
printf sprintf
scanf sscanf
fopen
fseek ftell — 操控文件内容指示位置 (位置指示器)
fgetc fputc fgets fputs fprintf fscanf — 读写文本文件
fread fwrite ---- 读写二进制文件
fclose - string.h
strlen
strcpy strncpy
strcat strncat
strchr strstr
strcmp strncmp strcasecmp strncasecmp
memset memcpy memcmp memmove - strlib.h
malloc free
srand rand
qsort - math.h -lm
sqrt pow
函数来源
- 自定义函数 ---- 实现者 使用者
- 别人写好的函数 ----- 使用者
1) 库函数—C语言标准函数库
2) 操作系统提供的 ---- 系统调用
3) 第三方函数 ---- 公司单位提供
函数定义
返回值类型 函数名(形参1类型 形参1名字,形参2类型 形参2名字,…,形参n类型 形参n名字)
{//函数体
}
- 实现者思维:
1) 确定函数功能 ---- 功能尽量单一 ----函数名
2) 确定实现功能需要的已知条件 ---- 形参
3) 如何将功能结果反馈给使用者 ---- 返回值 指针类型的形参
4) 注释形式写出由已知条件实现功能的步骤
5) 按注释步骤实现代码
形参:形式参数,在形式上告诉调用者使用该函数功能必须提供哪些已知条件
- 什么时候需要自定义函数? — 函数在程序中的作用有哪些?
1) 功能型函数 ----- 可以多处使用同一功能(解决重复劳动)
2) 拼装型函数 ----- 通过调用其它函数来实现自身功能
3) 简化逻辑型函数 ---- 简化某一个实现逻辑而作的辅助型函数
函数调用
- 使用者思维:
1)确定函数功能:通过函数名可以知道明面上的功能,但有些函数还有隐藏功能(函数名无法给出)
2) 需要提供哪些东西给函数 ---- 形参
每个形参的作用
3) 如何获取处理结果 ---- 返回值 指针类型的形参
某些形参的作用
返回值的作用
函数还有隐藏功能,如fread函数的隐藏功能-- 从位置指示器当前指示位置开始读数据到指定内存,读成功几个字节后再将位置指示器加几
函数声明
函数声明用于协助编译器检查函数调用是否正确
- 包含头文件 ----- 别人写的
- 手动声明 ---- 自己写的
Linux系统编程
(外设访问)
操作系统原生IO操作-------文件、文件系统、描述符
(多任务编程)
多进程 -------进程
进程间通信(IPC) -------信号、管道
多线程 --------线程
线程同步 --------信号量、互斥锁、临界区
Linux网络编程
网络编程 ------- 协议、协议栈、MAC地址、IP地址、端口号、TCP、UDP
操作系统基础 (Operating System)
什么是操作系统?
程序分类:
1) 应用程序:只能运行在对应操作系统上的程序
2) 裸机程序:直接运行在硬件上的程序
操作系统:是给app提供运行环境的裸机程序
操作系统发展史
压榨硬件使用价值的历史
-
无操作系统时代
a. 两个程序运行之间有时间空隙
b. 人工监控 -
批处理系统时代----- 监控程序
解决了:
a. 两个程序运行之间有时间空隙
b. 不再需要人工监控
新的问题:
需要从外设获取数据的程序,在外设数据没有准备好的情况下会出现等待
- 多道系统时代 — 多道批处理程序
既监控程序是否运行结束,又监控程序是否等待外设数据
出现新的需求 ---- 希望同时跑多个程序
- 多任务系统时代
多核CPU:一定程序上实现真正的并行执行多个任务
单核CPU:
多任务引起的新问题:
a. 任务间如何避免干扰
b. 多个任务共享同一资源如何解决冲突
c. 如何实现任务间通信
d. 如何简化上层app操作硬件
多任务操作系统
- 单核CPU多任务实现原理 ---- 分时机制
伪并行 ---- 利用人类对时间刻度的感觉差
轮流使用CPU时间片 ----- 时间片轮转 - 操作系统的模块划分
1) 任务管理 ------ 最核心的模块
2) 内存管理 ------ 次核心的模块
3) 设备管理 ------ 驱动程序
4) 网络管理 ------ 实现各种协议栈
5) 文件管理 ------ 如何访问外存中的文件和特殊文件
6) 启动管理
7) 用户管理 — 多用户操作系统才有的模块
用户(用户名) 用户组(组名)
目录可执行是指能不能将该目录作为当前工作目录来用(能不能cd进去)
- 操作系统的核心管理对象 ------ 执行流
什么是执行流: 总体上顺序执行的代码
执行流分类:
- 异常服务程序 — 不参与时间片轮转,霸道执行流:打断任务流执行,
一次执行完所有代码- 任务流 — 参与时间片轮转
进程
线程
-
任务五状态
两个基本状态:
1) 就绪态:等待进入执行态的状态
2) 执行态(运行态):占用时间片执行代码的状态
三个特殊状态:
3) 暂停态:由于外部的干扰让程序暂时停止执行,而不是自身逻辑引起的
如:gdb调试程序
4) 睡眠态(阻塞态):由于程序自身逻辑的需要,
必须要等待某个条件成立或获取到相应资源才能继续执行后续代码的状态
5) 僵死态:任务退出后,但任务所占用的资源还未被系统回收
僵尸任务 -
函数分类 ----- 阻塞、非阻塞
阻塞型函数:可能会引起调用任务进入睡眠态
非阻塞型函数:不可能引起调用任务进入睡眠态
程序运行时的分区
栈区:非static局部变量,形参
FILO(先进后出)
大小有限(8M) 栈区如果被用完会造成栈溢出的段错误
堆区:手动申请 手动释放
内存泄露:动态申请的内存空间程序不再使用后没有及时释放
p = malloc(100);
....//使用动态空间的代码
free(p);//1 ------ 没有内存泄露
//以下代码不再使用该动态空间
while()//30分钟
{
}
free(p);//2 ------ 有30分钟的内存泄露
....//5分钟
free(p);//3 ------ 有35分钟的内存泄露
//程序退出
数据区:static局部变量、static全局变量、非static全局变量、字符串常量
特殊只读段:只能读不能改,字符串常量、const修饰的static局部变量、static全局变量、非static全局变量
生存期:整个程序运行期
代码区:二进制指令 ----- 函数指针
一个软件的设计流程
需求分析
软件设计
软件实现—编码(20%)
集成
测试