C语言发展史:
1960年,原型A语言->ALGOL语言
1963年,剑桥大学CPL语言
1967年,剑桥大学BCPL语言
1970年,贝尔实验室对BCPL语言进行改进,做成B语言。用B语言和汇编写了UNIX。
1973年,贝尔实验室,Riche对B语言进行改动,写了C语言,用C语言和汇编重写了UNIX。
C语言特点:
1.基础性语言
2.语法简洁、紧凑、方便、灵活
3.运算符、数据结构丰富
4.结构化、模块化编程
5.移植性好,执行效率高
6.允许直接对硬件操作。
学习建议:
1.掌握正常的概念
2.动手能力
3.阅读优秀的程序段
4.大量练习,面试题
C课程讲解思路:
1.基本概念
2.数据类型,运算符和表达式
3.输入输出专题
4.流程控制
5.数组
6.指针
7.函数
8.构造类型
9.动态内存管理
10.调试工具(gdb,make)
11.常用的库函数
平台介绍:
64位redhat6,vim,gcc(make)
一、基本概念
·1.以helloworld为例对写程序的思路提出如下要求
(1)头文件正确包含的重要性
(2)以函数为单位来进行程序编写。
(3)声明部分+实现部分
(4)return 0;
(5)多用空格空行
(6)添加注释
2、算法:解决问题的方法(流程图,NS图,有限状态机FSM);
3、程序:用某种语言实现算法
4、进程
5、防止写越界,防止内存泄露,谁打开谁关闭,谁申请谁释放。
二.数据类型,运算符和表达式
1.数据类型

(2)存储区别
(3)不同类型之间的转化
变量
用来保存一些特定内容,并且在程序执行过程中值随时会发生变化的量。
定义:[存储类型] 数据类型 标识符=值 TYPE NAME=VALUE;
标识符:由字母、数字、下卉线组成且不能以数字开头的一个标识序列。写标识符尽量做到见名生义。
数据类型:基本数据类型+构造类型
存储类型:auto static register extern(说明符)
auto:默认,自动分配空间,自动回收空间。
register:(建议型)寄存器类型,只能定义局部变量,不能定义全局变量;大小有限制,只能定义32位大小的数据类型,如double就不可以,寄存器没有地址,所以一个寄存器类型的变量无法打印出地址查看或使用。
static: 静态类型变量,自动初始化为0值或空值,并且其变量的值有继承性。
extern:说明型,意味着不能改变被说明的变量的值或类型。
变量的生命周期和作用范围:
1.全局变量和局部变量
2.局部变量和局部变量
3.参考图片
3.运算符和表达式
表达式与语句的区别
运算符部分
(1)每个运算符所需要的参与运算的操作数个数
(2)结合性
(3)优先级
(4)运算符的特殊用法:如%,要求两边操作数必须是整数。自增自减,如果运算符在前,先进行计算,再取变量值使用; 变量在前,先取变量值使用,再进行计算。
(5)位运算的重要意义
https://www.processon.com/embed/632bd89c637689341d6d3c2f

五、数组
构造类型之一,连续存放。
一维数组:
1.定义:[存储类型] 数据类型 标识符[下标]
2.初始化:可以不进行初始化; 也可以全初始化,如int arr[3]={1,2,3};也可以部分初始化,如int arr[3]={0},部分初始化其后面未初始化的为0;一般为auto类型,如果用了static修饰,则放到静态区,即使没有初始化,也会被初始化为全0》
3.元素引用:数组名加下标。
4.数组名:int arr[3]; 数组名是表示地址的常量,也是整个数组的起始位置。
5.地址越界:int arr[3]; arr[3]=10; printf(“arr[3] is %d”,arr[3]);
二维数组:
1.定义,初始化:【存储类型】数据类型 标识符 【行下标】【列下标】
2 元素引用
3.存储形式:
4.深入理解二维数组
结构体
1.产生及其意义:
2.类型描述
3.嵌套定义
4.定义变量(变量、数组、指针),初始化及成员引用
5.占用内存空间大小
大纲
I/O:APUE第3、5、14章
文件系统 :4、6、7章
并发:信号 10章、多线程10、11章
IPC进程间通信:8章进程基础(涉及到多进程)、13章守护进程,15,16章+
注意事项:
1.弃用root用户
2.重构原来的程序
3.课程重点:项目,课堂代码,面试题,实验性题目,推荐书籍的课后题
I/O:input & output
I/O是一切实现的基础。
分成系统调用IO(sysio)(又称为文件IO)、标准IO(stdio)两种。
如果两种都可以使用,优先使用标准IO。标准IO可移植性好,合并系统调用(buffer,cache,绝大时候好用)。stdio依赖sysio实现。
fopen在Linux下依赖open函数,在unix下依赖openfile函数。
stdio:
fopen();
fclose();
fgetc();
fputc();
fgets();
fputs();
fread();
fwrite();
printf();
fseek,ftell:返回值long,最大2个G的文件。创建空洞文件。
fseeko,返回值为offset_t.
fflush():
缓冲区的作用:大多数情况下是好事,合并系统调用 。
行缓冲:换行的时候刷新; 满了的时候刷新;强调刷新(标准输出是这样的,因为是终端设备)。
全缓冲:满了的时候刷新,强制刷新(默认,只要不是终端设备)。
无缓冲:如stderr,需要立即输出的内容。
可以通过setvbuf修改。尽量不要用。
getline(): 原来的函数不能完整取得一行。
临时文件:1.如何不冲突2.及时销毁:tmpnam tmpfile函数。
文件IO/系统调用IO:
文件描述符fd是在文件IO中贯穿始终的类型。
什么是文件描述符:数组下标整形数,数组中存放打开文件的结构体的首地址。文件描述符优先使用当前可用范围内最小的。

文件IO操作:open,close,read,write,lseek
文件IO与标准IO进行区别:举例:传达室老大爷跑邮局。区别:响应速度&吞吐量。面试:如何使一个程序变快?
IO的效率问题:
提醒:标准IO与文件IO不能混用。
fileno():将FILE类型转换为fd类型。
fdopen():将fd转换为FILE
文件共享问题
原子操作:
原子:不可分割的最小单位。原子操作的作用:解决竞争和冲突。
程序中的重定向:dup,dup2
同步:sync,fsync,fdatasync
fcntl();
ioctl();
/dev/fd/目录:虚目录。当前进程所用到的文件符信息。
文件系统
一.目录和文件1.获取文件属性:stat,fstat,lstat2.文件访问权限:st_mode是一个16位的位图,用于表示文件类型,文件访问权限及特殊权限位。3.umask:防止产生权限过松的文件。4.文件权限的更更改/管理:chmod,fchmod5.粘住位:t位,原来是给二进制可执行文件使用,让其常驻内存。现在用于目录,各个用户对于目录的操作控制。6.文件系统:FAT,UFS。文件系统:文件或数据的存储格式问题。FAT16/32:静态存储的单链表。
7.硬链接,符号链接
二.系统数据文件和信息
三.进程环境:
并发
同步事件、异步事件:
异步事件的处理:查询法,通知法(江边抄鱼、鱼池起鱼),用什么方法比较合适
一.信号
1.信号的概念:信号是软件中断,信号的响应依赖于中断。
2.signal();
3.信号的不可靠
4.可重入函数
5.信号的响应过程
6.信号常用函数
kill();
raise();
alarm();
pause();
abort();
system();
sleep();
7.信号集:
8.信号屏蔽字和 pending 集
9.扩展:
sigsuspend();
sigaction();
setitimer();
10.实时信号相关内容
二.线程
1.什么是线程:一个正在运行的函数。
posix线程是一套标准,而不是实现。
openmb标准:
线程类型:pthread_t posix标准下的线程类型,具体是什么类型不太清楚。在linux下是整形数。
进程是窗器,用来承载线程。
pthread_equal():用来比较两个线程ID。
2.线程的创建、终止、线程取消、栈清理
3.线程同步:互斥量、条件变量、读写锁
4.线程相关的属性、线程同步的属性
5.可重入、线程与信号、线程与fork
高级IO
非阻塞IO–阻塞IO
补充 :有限状态机编程
1.非阻塞IO
2.IO多路转接
3.其他读写函数