章节题目---3、4、5
1. C语言的核心知识点是什么?
核心为函数,
分支1为基本数据类型,指针和数组
分支2为结构体、共用体(联合体)、空类型
2. 请描述C语言语句的分类
执行语句和非执行语句}
执行有1.独立语句(以;结尾):表达式语句,变量定义语句,函数调用语句,跳转语句,空语句
2.符合语句(以}结尾等):普通复合语句、选择语句、分支语句、循环语句、函数定义
3. 请描述C语言源码编译的全过程
预处理--------编译--------汇编-------***-----链接
*.c----*.i-----------*.s----------*.o--------**-----可执行文件
(按照—定的规则〔可执行文件的格式)将所有.o以及用到的库文件的全部部分信息组合成可执行文件)
预处理编译汇编这三步对每个.c文件分别进行,相互之间没有任何关联
库开发:多个.o文件也可以采用相应指令(ar),将它们按照一定规则组合成静态库文件
多个.o文件也可以通过给gcc一些指定选项,将它们按照一定规则组合成动态库文件
4. 请描述C语言数据类型的分类以及如何学习
5.char、short、int、long、float、double和指针类型的sizeof分别是多少?
1,2,4,4/8,4/8,4,8
6.请描述基本类型变量定义语句的作用
1.确定类型
2.分配内存
3.起名
4.把首地址与变量名绑定
7. 变量四属性分别是什么?
- 显式属性:定义语句中已指定出来的
- 数据类型
- 变量名
- 隐式属性:定义语句中无法直接看出来,但实际上存在的
- 空间首地址(左值,变量地址)
- 当前空间存放的二进制位序列(右值,变量当前值)
8.什么是表达式?
有运算结果的式子
表达式依据计算结果可分为:
1. 数值表达式(数学表达式):运算结果为某一具体大小的数值
2. 逻辑表达式(条件表达式):运算结果只论成立不成立 或 是真(成立)是假(不成立) 或是非0(真)还是0(假)
3. 地址表达式:运算结果虽然也是某一具体大小的数值,但该数值为内存空间某一字节的编号即地址值
3 < 5
成立 ----- 非0 ----- 真
不成立 ---- 0 ----- 假
int x = 0;
&x
&(x+2)
x & y
表达式的组成要素有常量、变量、运算符和子表达式,
有没有运算结果是判断是不是表达式的标准,因此:
1. 运算符不是组成表达式必须的组成要素,单独的一个常量我们认为也是一个表达式,这个表达式的运算结果为该常量的值,
同样,单独的一个变量我们认为也是一个表达式,这个表达式的运算结果为该变量的当前值。
2. 但是,我们在编程中由于任务需要,必须让计算机帮我们做很多运算,而这些运算必须使用到代表这种运算的运算符。
3. 一个表达式也可以成为另一个表达式的组成部分,其运算结果参与新表达式的运算。
4. 项目开发中不鼓励写太复杂的运算表达式,以免影响代码的可读性。
9. 什么是逻辑短路?
略
10. C语言支持几种除法运算?
/和%
11. 将一个变量指定位置0、置1、取反分别用什么运算?
&0置0 |1置1 ^1取反
12. sizeof运算的特点
1. 编译阶段进行的运算,其组成的表达式在目标代码中被其计算结果所代替,
2. 计算结果的类型是unsigned long类型的别名size_t
章节题目---6
1. 何时需要函数声明?函数声明语句的作用?
略
2. 请描述函数定义的语法和函数定义的作用和函数返回方式
略
3. 请描述函数调用过程
函数调用时,首先在调用前分配一个内存空间,调用函数时也就是调用分配的内存首地址。
当函数执行到return关键字或者执行到最后时,被调用函数执行就执行结束,此空间的内存也将被释放。
章节题目---7、8:
1. 什么情况用多重if-else?什么情况用switch?
switch-case只能对整形数进行判断,而且是单个的整型数
2. switch语句中如果某个case没有break语句,代码如何执行?
会继续执行下一条语句
3. break语句适用于哪些语句、作用是什么?continue语句适用于哪些语句、作用是什么?
break结束循环体,
4. 编程过程中如何选择三种循环?
continue结束此行后的本次循环(结束一次循环)
5. 项目中死循环如何写?
略
6. do{}while(0);与普通复合语句{}的区别
前者可以使用break和continue等跳出语句,否则要使用goto语句,此语句非常危险;
章节题目---9、11
数组相关:
1. N维数组的sizeof怎么算?
Sizeof(N维指针)-> N维数组(或其他)的大小 如,二维数组的一维大小为第一维的数组整个的大小
2. 请描述三维数组定义语句的作用?
3个基本作用:
1.给该数组分配sizeof(N维数组名)个字节的内存空间2.该空间命名为N维数组名
3.该空间中每sizeof(T个字节描述—个T类型的元素N个
额外作用:
1.相当于定义M1个N-1维的数组,它们名字叫做N维数组名[第一维下标x1]x1---->[0,M1-1]
……
2. N.相当于定义了M1*M .."Mn-1Mn个元素类型的变量,它们名字叫做N维数组名(第一维下标[x1]第二维下标s2 ….(倒败第二维下标][最后一维下柄)
3. 如何给一个4维数组初始化?
N维数组名[M1][M2]....[Mn] =0.{0.f...N层嵌套...(档.}..-..}..--...}; //N个{}嵌套使用
4. 数组名相当于什么地址?
数组名相当于整个数组的首地址,若对其加1,则加了整个数组的大小的地址;
5. 数组下标的取值范围是什么?
是数组大小减1,也就是N-1;
6. 已知一个一维数组float arr[8],则&arr和&arr[0]分别是什么?
虽然地址值相同的,但是他们的类型大小不一样,若对其进行“+1“操作,前者+的时整个arr数组的大小,后者+的是arr的一个元素的大小。
7. 某个函数的形参为double arr[4][5][3][7],其等价于哪一种指针?
等价为四级指针; 等价为一维数组的三级指针; ……
8. 数组可不可以作为函数的返回值类型?
不可以
定义为静态后返回指针类型可以完成返回数组
9. 请背诵掌握数组关键知识的三句口诀
总决:**N维数组都可以看作是一维数组,这个一维数组中的元素都是N-1维的数组**
分决:
1. **数组名在表达式中单独出现时,其等价于:下标为0元素所在空间首地址**,两种情况除外:
a. &数组名 此时数组名代表整个数组所占内存空间
b. sizeof(数组名) 此时数组名代表整个数组所占内存空间
2. **数组类型作为函数形参类型,该形参完全等价于:指向数组元素的指针**,即用来存放地址值的变量(可以存放数组中某一个元素内存空间的首地址)
指针相关:
1. 什么是T类型的地址?
也就是在地址值的基础上,此地址内存中的二进制的作用不同。
2. 访问某块内存中的内容有几种方式?
直接用变量名进行访问
借助地址加*取地址
3. 指针类型的sizeof如何求?
4/8
4. 请描述一级指针变量定义语句的作用
分配空间
规定类型
获取所分配空间的首地址
确定变量名
5. 两个同类型的地址值相减所得的结果是什么?
是相邻的个数
6. 已知有T类型的地址值,对该地址值+整数是如何运算的?
地址值会加上这个(整数*T类型的字节数)
7. 地址类型转换运算的本质是什么?有可能发生什么样的错误?
改变地址内的二进制的作用或表现形式,发生越界和乱码的错误。
8. 已知有个指针变量名称为p,则&p和&(*p)有什么区别?
一个是对p指针取地址,一个是自身
9. 什么是空指针?什么是野指针?如何防止野指针?
略
10. 什么是通用指针?有何特点?如何使用?
void需要转化
11. 数组名单独写时相当于什么样的地址?
表示整个数组的首地址,大小为整个数组的大小,也就是所有元素在一起的大小
12. 形参类型是数组类型时相当于什么样的指针类型?
一维指针
13. 如何将一块内存空间通过形参传递给一个函数?
对其取地址,然后通过指针形式传递给函数。
14. 数组可不可以作为函数的返回值类型?
纯数组不可返回
15. 指针类型可不可以作为函数的返回值类型?如果可以需要注意什么?
注意不要返回局部变量
16. 指针类型的形参按其在函数中的使用方式如何分类?
1、值参数:函数体中只读该形参指向空间的内容。示例:查找 searchvalue.c
2、结果参数:函数体中只改该形参指向空间的内容。示例1:一个函数求最大值和最小值 getmaxmin.c 示例2:两个数组相加到第三数组 addarray.c
3、值-结果参数:函数体中既要用原内容又要向空间填写新内容。示例:排序函数 arraysort.c
17. 请描述二级指针变量定义语句的作用
1、分配 sizeof(Type *)个字节的内存空间(指针自身空间)
2、给空间命名为指针变量名(指针自身空间)
3、空间(指针自身空间)二进制位的作用是描述一个无符号整数,该整数的含义是另一内存空间(指针指向空间)第一个字节的编号(即地址值)
4、指向空间中的二进制位作用是从首地址开始每sizeof(Type)个字节存放一个Type类型的元素,此元素为一级指针的地址
18. 请描述三级指针变量定义语句的作用
略
章节题目---10
1. 字符串用什么来存储?
一串连续的内存空间
2. 已知一个字符数组的定义为:char buf[]="hello",则sizeof(buf)、strlen(buf)、sizeof(buf[0])、sizeof(&buf[0])的值分别是多少?
.sizeof计算的是(整个内存的大小“包括“/0”),strlen是计算(正在使用的内存)
3. 字符串常量有何特点?
存储在静态存储区不可修改,而且在编译时就分配了空间和内容,
4. 已知有4个char *指针:p1指向某个字符型变量,p2指向一个未存放字符串的字符数组,p3指向一个存放着字符串的字符数组,p4指向字符串常量
则,sizeof(p1) strlen(p1) sizeof(p2) strlen(p2) sizeof(p3) strlen(p3) sizeof(p4) strlen(p4)的值分别是多少?
未给初值的strlen的大小不确定。其他略
5. strcpy和strncpy的区别
前者是靠识别“/0“来识别拷贝的,而后者是靠”n“的大小是控制拷贝的大小的。
6. 请描述处理字符串的代码一般形式
Strstr(从右往左早相应字符切不改变原值),
char *strtok ( char *str1,const char *str2 ) ;从前往后找对应字符,会改变原值
7. scanf的%s和gets函数分别有什么毛病?
前者:%s 只能读取一个单词,空格、回车都将结束此输入程序,同时也没有办法防止越界
后者:解决了只能读取一个单词的问题,但是越界仍然无法防止。
8. 如何将"1234"转换成整数1234?
略
章节题--12
动态分配相关:
1. 什么是内存泄露?
动态申请的内存没有及时释放的内存
2. 程序中用到的内存空间来源方式有几种?
两种方式:
1.固定分配(静态分配):编码时已经明确所需内存空间大小
C语言通过变量定义来实现
2动态分配:编码时不知所需内存空间大小,程序运行到某处才能计算所需空间的大小
程序中调用malloc函数向操作系统申请,使用完毕后还需调用free函数将申请到
的内存空间归还给操作系统(释放空间、回收空间)
3. 请描述动态分配内存的代码模块
int *p = (int *)malloc(sizeof(int));
if(p == NULL)
printf("GG\n");
4. 程序运行过程的内存划分哪几个区域?每种区域中内存如何获得?
程序运行过程占用的内存操作系统会将其划分为4个部分(内存四区):
1、栈区:满递)减的顺序柱,每个进程、线程都有它们专门的栈区,栈区大小是固定的(由操作系统来指定,如桌面版Linux规定为8M),因此可能会发生栈溢出
A、非static局部变量定义、函形参定义语句被执行时从栈区中为对应变量、形参分香控间(其本质是对满递减的顺序栈进行一次入栈操作)
B、非static局部变量、函数形参的内存空间在变量所属复合执行完毕、形参所属函数定义(却本次调用返回)执行完毕,空间被回收(其本质是对满递减的顺序进行一次出栈操作)
自动存储时期
2、堆区:空闲的自由空间,动态分香的空间来自本区域,使用该区域内的一部分内存需向操作系统申请,使用完毕后应及时归还给操作系统
动态存储时期
3、数据区:本区域总大小,在编译器编译源码时由编译器进行统计
A、全局变量、static局部变量、字符串常量(位于数据区的只读部分)
B、静态存储时期
4、代码区:按函数形式组织的指令-------函数指针
静态存储时期
5. 说出7种常见的内存操作错误
- 内存泄露
- 越界
a、死掉
b、逻辑混乱 - 野指针
- 野值—未初始的--- memset(&stTest,0,sizeof(struct sample_struct));
5、栈溢出
6、试图修改数据区的常量区
7、二次释放
6. 请描述memcpy和strcpy的区别
前者可以拷贝任何东西,后者只能是数组
7. 请描述memcpy和memmove函数的区别
前者若是有内存重合不可拷贝,特指(地址)重合
8. C语言编程的第二大基本原则是什么?
类型一致原则
内存一致原则
变量特性相---13
1. 什么是作用域?
标识符的作用域:标识符名称的默认使用范围---就是哪段代码内可以直接用命名的名称代表定义的实体,而无需做其它辅助操作
C语言中只要程序员可以命名的东东均有作用城:变量名、函数名、类型名、宏名、枚举常量名(成员名由于不能独立使用因此不用考虑名称使用范围)
1>局部作用域:定义语句所在行开始------定义语句所隶属的复合语句结尾(函数形参隶属于函数体这个复合语句)
2>文件作用域:定义语句所在行开始-------定义语句所隶属.c文件结尾
2. 什么是链接性?
标识符的链接性:标识符作用域之外,能不能用相应的名称代表定义的实体,如能又是什么样范围,又需做什么的辅助
1>无链接性:该名称只能在其作用域范围内使用
2>内部链接性:作用域之外,当前.c文件内可用,用前需辅助对应的声明语句
3>外部链接性:作用域之外,任何.c文件内可用,用前需辅助对应的声明语句
3. 什么是生存期?
空间的生存期:是指程序中分配得到内存空间在什么样的时间段内可用
- 自动存储时期:从定义语句被执行这个时刻开始------该定义语句所隶属的复合语句被执行完这个时刻
- 静态存储时期:程序运行前-------程序运行结束(整个程序运行期)
3>动态存储时期: malloc成功分配-----对应free函数调用
4. 请描述static关键字的作用
static关键字小结:
1.static修饰局部变量时,将局部变量的生存期由自动存储时期改为了静态存储时期
2.static修饰全局变量时,将全局变量的链接性由外部链接改为了内部链接
3. static修饰函数定义时,将函数的链接性由外部链接改为了内部链接
5. 请描述register关键字的作用
register和auto的区别
1、register关键字是一个建议性质的关键字,而不是强制,只有满足如下情况时才生效:
- sizeof不能超过一个CPU寄存器的容量
- 程序运行该处时有空闲的CPU寄存器
3>后续代码中没有对该变量的取地址操作
2、现在的编译器都比较智能,非static局部变量和函镬婚参即使不加register, 它也会尽量去用CPU寄存器作为变量的空间使用。当然是在满足上面的
三个条件的基础上
3、auto关键字可省略,但register不可省略; 4. register修饰局部变量不可对其做地址运算,如果做了会发生编译错误
6. 请描述extern关键字的作用
略
7. 请描述const关键字的作用
将变量放在静态存储区
8. const修饰指针类型变量时如何分辨该指针的只读特性
const关键字:含义应理解为只读的变量1.修饰局部变量和形参
该变量和形参的空间仍然在栈区,但栈区没法做成只读,因此:
1>后续代码不可通过变量名去修改它的内容,否则编译出错
2>但可以通过其地址值去修改它的内容,但实际项目中不会这样去用
2.修饰全局变量
全局变量的空间有数据区可读可写段转移到常量段,因此:
1>后续代码不可通过变量名去修改它的内容,否则编译出错
2>也不可以通过其地址值去修改它的内容,否则程序运行时发生段错误
3.const修饰变量定义一定要初始化,否则const关键字不起任何作用
4.const修饰指针时,有两种不同的意义:
1>指针变量自身空间只读的,此时const关键字后应紧跟指针名
2>说明不可以通过该指针变量名去修改其几级指向空间的内容,具体是几级视const与指针名间的*个数而定
const修饰指针时,可以同时出现多个const,每个const的理解分开各自理解即可
章节题目:
结构体相关:
1. 结构体的sizeof运算过程?
对其原则
2. 请描述结构体类型变量定义语句的作用?
- 给整个款组分配sizeof(结构体类型*N个字节的空间
- 给整个空间命名为数组名
- 每sizeof(结构体类)*8个二进制位描述—个结构体类型的元素
3. 请描述结构体类型指针定义语句的作用?
- 给该指针变量分配sizeof(结构体类型*)个字节的内存空间
- 给该空间命名指针变量名
- 该空间使用sizeof(结构体类型*)*8个二进制位描述一个地址值
额外作用:
1>以指针变量自身空间中存放的地址值为首地址的空间(指向空间)中存放的是结构体类型的元素
4. 请描述结构体类型数组定义语句的作用?
- 给整个款组分配sizeof(结构体类型*N个字节的空间
- 给整个空间命名为数组名
- 每sizeof(结构体类)*8个二进制位描述—个结构体类型的元素
额外作用:
1>相当于同时定义了N个结构体类型的变量,这些变量名为数组名[下标]或*(数组名+下标)
2>数组中每个元素即为一个结构体类型的变量。而该元素所在空间相当于同时定义很多个名称为:数组名[下标].成员名((数组名+下标).成员名
5. 已知一个结构体类型变量,访问其成员的方法有几种?
略
6. 结构体类型作为函数形参类型有什么特点?如何改造其缺点?
可以把多个类型的多个参数打包在一个结构体进行传参,
缺点是会耗费大量的空间和时间,效率低
7. 结构体类型作为函数返回值类型有什么特点?如何改造其缺点?
同上
8. 结构体中成员类型能不能是指针类型?如能则该成员空间存放的是什么?
可以,指针
9. 如何比较两个同类型结构体变量的大小?
略.
10.请描述深拷贝和浅拷贝的区别?
浅拷贝是共用一块内存空间,任何一方修改其值,这块内存的就会改变。
深拷贝是各有各的空间,不会相互影响
预处理相关:
1. 预处理阶段主要做哪些事情?
1>傻替换
#define ------宏定义宏-----替换规则
#include ----头文件包含
2>条件编译
先判断指定的条件是否成立,决定哪些代码参与下一步的编译,哪些代码不参与下一步的编译(相当于被注释)
3>向下一步源码处理工作(即编译)传递一些参数
这些参数会告诉编译时遇到一些特殊情况时按什么方式处理
2. #include时<>与""的区别
1>指定文件名可以带相对路径(理论上也可以带绝对路径,但是一旦源码所在目录发生改变,则绝对路径也会跟着改变而导致用房路径找不到相应文件)
2>C语言没有明确规则被包含文件必须是.h文件,.c文件或其它文件理论上也是可以,不过项目中99.9%的情况下被包含的是.h文件
3><>首先在操作系统指定目录(Linux系统一般是/usr/include)下查找被包含文件,
然后再到编译器相应选项指定的目录下查找被包含文件(gcc的一个-选项可以指定一个查找被包含文件的路径,n个-l选项可以指定n个路径)"":首先在#include语句所在源文件的同目录(俗称当前目录)下查找被包含文件,
然后在操作系统指定目录(Linux系统—般是/usr/include)下查找被包含文件.
最后再到编译器相应选项指定的目录下查找被包含文件(gce的一个-l选项可以指定一个查找被包含文件的路径,n个-选项可以指定n个路径)
4>项目中一般:
来自于操作系统的头文件和C语言标准库头文件一定用<>来自于其他公司提供的某库头文件---推荐用<>
来自于同一项目其他同事的头文件---推荐用""自己编写的头文件—定用”"
3. 无参宏定义宏体是表达式时应注意什么?
1>替换规则------傻替换,不会先对宏体中表达式做计算然后再替换
2>c语言没有对宏体内容做任何约束,即宏体可以是任意内容(甚至可以为空)
宏体正不正确,看其替换后是否符合c语言语法以及程序员所期望语义(即由下一步编译来检查替换后是否正确)a.宏体为表达式:项目中建议对整个宏体加上0.以避免因运算符优先级带来的理解困扰
b.宏体为语句:项目中建议对整个宏体加上#.以避免因使用处复合语句省去{}带束的理解困扰
c.宏体为空:也被为开关宏,将本宏定义语句注释掉表示关,而将本宏定义语句去掉其作为注释表示开,一般与后续的iHifdef ilfndef球用
d.其它形态:程序员编写时,需要尝试在使用处展开替换,自行判断其是否正确
4. 带参宏定义宏体是表达式时应注意什么?
(1)带参数的宏定义的<宏体>应写在一行上,如果需要写在多行上时,在每行结束时,使用续行符 "\"结束,并在该符号后按下回车键,最后一行除外。
(2)在书写带参数的宏定义时,<宏名>与左括号之间不能出现空格,否则空格右边的部分都作为宏体。
1>替换规则----两轮傻替换:首先将后续代码中宏名(宏实参列表)的写法替换为整个宏体―然后再将宏体所有参数名宇替换为对应的实参写法
2>c语言没有对宏体内容做任何约束。即宏体可以是任意内容(甚至可以为空)
宏体正不正确,看其替换后是否符合C语言语法以及程序员所期望语义(即由下一步编译来检查替换后是否正确)
a.宏体为表达式:项目中建议对整个宏体加上(的同时将宏体中每个宏参名也加上O.以避免因运算符优先级带来的理解困扰
b.宏体为语句:项目中建议对整个宏体加上队以避免因使用处复合语句省去|)带来的理解困扰,同时也要将宏体中每个宏参名加上O,以免因运算符优先级带来的理解困扰c宏体为空:也被为开关宏,将本宏定义语句注释掉表示关,而将本宏定义语句去掉具作为注释表示开,一般与后续的#ifdef tifndef联用
d.其它形态:程序员编写时,需要尝试在使用处展开替换,自行判断其是否正确
5. 请描述宏名的作用域
1>作用域:宏定义语句所在行到当前.c文件尾
2>链接性:无链接性
3>可以提前结束宏名的作用域:
#undef 宏名
6. 条件编译时如果指定条件不成立,则对应源码会不会被执行?为什么?
不会,因为在编译阶段不成立的部分不会被编译进运行程序中
7. 头文件的作用是什么?哪些内容可以写进头文件?
是代码模块化,试代码起看来更简洁,减少重复书写,有更好的可移植性
8. 如何防止头文件被重复包含?
略
章节题目 ---17章:
1. 请描述二级指针定义语句的作用
- 数组名
- 空间
- 首地址
- 类型
2. 请描述三级指针定义语句的作用
- 数组名
- 空间
- 首地址
- 类型
3. 请描述数组指针定义语句的作用
- 数组名
- 空间
- 首地址
- 类型
4. 请描述函数指针定义语句的作用
- 函数指针名
- 空间
- 首地址
- 返回值类型
- 函数参数类型和个数
5. 如何理解复杂的变量定义语句?如:int (*parr[5])(void *,float)
先左在右再左再在右,直到最后
6. 什么情况必须要用函数指针?
先要根据条件给函数指针付首地址,然后还有给参数赋值,才能执行的情况下,必须用二级指针
7. 什么类型的数组作为函数形参类型等价于三级指针?
三维数组的数组名
8. 什么类型的数组作为函数形参类型等价于指向N维数组的数组指针?
N+1维数组类型
章节题目:
1. 请描述使用标准IO函数操作文件的代码基本模板
FILE *pf = NULL;
pf = fopen("./test.txt","r");
if(NULL == pf)
{
//出错处理
//失败原因:1. 对于r方式(“r”或“r+”)打开,可能是文件不存在,也可能是没有读权限
// 2.对于w或a方式打开,可能是外存空间不足或可能是对应目录没有写权限,也可能是没有写权限
}
/*
文本文件的读写函数:fgetc fputc fgets fputs fprintf fscanf
非文本文件的读写函数:fread fwrite
位置指示器的操作函数:fseek ftell
*/
fclose(pf);
pf = NULL;
2. 请描述使用系统IO函数操作普通文件的代码基本模板
int open(const char *pathname,int flag)
int open(const char *pathname,int flag,mode_t mode)
lseek(fd,0,SEEK_CUR)
ftell
3. 请描述读取目录文件内容的代码基本模板
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc , char* argv[])
{
DIR * dir;
struct dirent * ptr;
int i;
dir = opendir("/etc/update-motd.d");
while((ptr = readdir(dir)) != NULL)
{
printf("d_name : %s\n", ptr->d_name);
}
closedir(dir);
return 0;
}
4. 标准IO支持哪三种缓冲方式,标准输入与输出采用、普通文件、标准错误分别采用的是哪种缓冲方式
关于标准IO支持三种缓冲方式:
1>行缓冲:缓冲区中碰到换行才去操作外存
2>全缓冲:缓冲区满才去操作外存
3>不缓冲:缓冲区不起作用,直接操作外存
默认情兄下:
标准输入文件、标准输出文件:行缓冲
普通文件:全缓冲
标准错误文件:不缓冲
5. 请描述fseek和ftell以及lseek函数的功能
- 只改不查
- 只查不改
- 可查可改
6. Linux支持哪7种文件?
Linux操作系统支持7类文件:
1.普通文件-----一般人非常所说的文件,有文件内容,文件内容表示一些相关信息 open、close、read、write、Iseek
2目录文件-----文件夹、目录,有文件内容,其内容是该目录下文件、子目录的信息opendir closedir readdir
3.链接文件------软链接:类似于windows下的快捷方式,有文件内容,其内容是指向文件的路径 symlink/link
硬链接:文件的别名机制
4.管道文件------无文件内容,用文件名来给某个通信管道命名open close read write mkfifo pipe
5.字符设备文件-----无文件内容,用文件名来给某个字符设备命名open、close、read、write, ioctl
6.块设备文件-----无文件内容,用文件名来给某个块设备命名分区、格式化
7.本地socket文件----无文件内容,本地socket通信时,用文件名作为服务端或客户端的地址 bind accept connect read write close
对7类文件均可以进行的操作函数:access、stat、unlink
对文件描述符属性操作的函数:fcntl
这些函数的核心实现均由操作系统内核提供,因此称为系统lO
7. 请描述stat和access函数的功能
int fstat(int fildes, struct stat *buf);
int stat(const char *path, struct stat *buf); ----- 掌握(重点)
int lstat(const char *path, struct stat *buf);
功能:读取指定文件或目录的状态信息即元信息
返回:执行成功则返回0,失败返回 < 0
参数:
fildes:与指定文件关联的文件描述符
path:通过路径名加文件名来指定文件
buf:用于保存指定文件的元信息
int access(const char *pathname, int mode);(重点)
功能:测试当前用户对指定文件的访问权限
返回:执行成功则返回0,失败返回<0
参数:
pathname:带路径的文件名或目录名
mode:指定所要测试的权限
R_OK 测试读权限
W_OK 测试写权限
X_OK 测试执行权限
F_OK 测试文件是否存在
可位或上述常量,同时进行测试
8. 硬链接和软链接的有何区别
硬连接被删就没了;软连接删除不会影响文件,就像快捷方式一样
9. 标准IO读写文本文件内容用哪些函数比较方便?对于非文本文件又如何读写?
文本文件读写的函数: fgetc fputc fgets fputs fscanf fprintf
非文本文件读写的函数: fread fwrite
10. 请描述标准IO和系统IO之间的关系
标准IO:文件的IO操作函数来自于C语言标准函数库
系统IO:文件的IO操作函数来自于操作系统内核
项目中:对于普通文件多数选择用标准IO函数
对于Linux下的特殊文件选择用系统IO
11. 什么是文件描述符?
文件描述符:
操作系统在程序调用open函数时,会创建一个操作对应文件引擎对象,为了方便管理这些引擎对象,操作系统会将这些引擎对象的内存首地址填写到一个数组(描述符数组)中(从下标0开始检查对应下标位置的地址是不是NULL,如果是NULL则新引擎对象的地址就填在该位置,并将该位置下标作为open函数的返回值返回)
章节题目:
1. 请描述什么是进程、什么是线程?
1.二者都是操作系统中参与时间片轮转的任务,均有5个状态
2.线程无法独立存在,只能隶属于创建它的进程
3.进程是操作系统分配资源的基本单位,即每个进程才有:内存四区、描述符数组
4.线程是参与时间片轮转的最小单位,即线程只有自己的栈区、寄存器组,堆、数据区、代码区、描述符数组共用其隶国的进程
5.安全性上,进程更安全,线程不太安全:一个进程崩溃不会影响其它进程,但一个线程崩溃会导致所隶属的整个进程崩溃
6.线程占用资源较少,进程占用的资源相对比较多,因此线程被称为轻量级任务,进程被称为重量级任务
2. 请描述任务有哪几种状态?什么情况下任务处于指定状态?
两个基本状态:
1.运行态:CPU正在执行其代码的状态
2.就绪态:任务处于等待时间片的状态三个特殊状态:
1.睡眼态:—个任务需要满足一定条件才能往后执行后续代码,
但该条件并不满足,因此需要等待执行条件满足
任务等待指定条件满足的时间段,其状态为睡眠态(阻塞态)按可唤醒的方式分为:
1>深度睡眠:只能被条件满足唤醒
2>浅度睡眠:被条件满足唤醒+信号唤醒
2.暂停态:—个任务由于外部干扰导致任务暂时停止执行(此后还可以恢复执行)
导致任务暂停或继卖的外部因素与任务的逻辑无任何关系
3僵死态:一个已退出运行的任务,但其占用资源还未被回收的状态
3. fork后父子进程哪些空间是共享的,哪些是各自的空间?
代码区,其他三区和标识符
4. 如何避免僵尸进程?
进程分离
及时wait回收
5. 如何避免僵尸线程?
分离线程
及时pthread_join回收
6. 请描述exit和pthread_exit的区别
exit结束整个进程,无论出现在那个线程中
pthread_exit只结束当前线程
7. 如何让线程成为分离的线程
pthread_detach(pthread_self()); //分离线程
/*初始化属性线程属性*/
pthread_attr_init (&attr);
pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL); //没有对比就没有伤害
8. 请描述pthread_cancel函数的功能
主要功能向线程发送一个终止命令,根据线程属性判断是否终止
线程是否响应
9. 一个进程被替换后哪些空间会被重置
内存四区全部重置