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.数据类型

(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.其他读写函数

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注