高级C语言程序设计考试复习.docx
《高级C语言程序设计考试复习.docx》由会员分享,可在线阅读,更多相关《高级C语言程序设计考试复习.docx(21页珍藏版)》请在冰豆网上搜索。
高级C语言程序设计考试复习
高级程序设计考试复习
在本周末(周日上午8点之前),将答案写在本文件中一同发我QQ邮箱。
每个人都提交。
一、关于C语言的高级部分
1.关于基本数据类型
写出floatx与“零值”比较的if语句。
If(x>0.000001&&x<-0.000001);
2.关于数组
(1)用递归法用一句代码求整型数组中所有元素的和。
分析:
如果数组元素个数为0,则和为0,否则,要算出n个元素的和,先需要算n-1个元素的和。
intsum(inta[],intn)
{
returnn==0?
0:
sum(a,n-1)+a[n-1];
}
(2)字符串逆序
给定一个含有n个元素的字符数组a,将其原地逆序。
voidnixu(char*a,intn)
intleft=0;
intright=n-1;
while(left{chartemp=a[left];a[left++]=a[right];a[right--]=temp;}}3.关于指针(1)关键字const是什么含意?下面的声明都是什么意思?const意味着“只读”,表示该量在初始化后不能被重新修改。constinta=20;//定义a为常整型数intconstb=20;//定义b为常整型数constint*c;//定义了一个指向常整型数的指针int*constd=(int*)&a;//定义了指向整型数的常指针constint*conste=(int*)0x3000;//定义了指向常整型数的常指针(2)用变量a给出下面数据类型的一个定义a)一个整型数(Aninteger);inta;b)一个指向整型数的指针(Apointertoaninteger);int*ac)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoaninteger);int**ad)一个有10个整型数的数组(Anarrayof10integers);inta[10]e)一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10pointerstointegers);int*a[10]f)一个指向有10个整型数的数组的指针(Apointertoanarrayof10integers);int(*a)[10]g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger);int(*a)(int)h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger);int(*a[10])(int)4.关于结构体(1)设有以下说明和定义:typedefunion{longi;intk[50];charc;}DATE;structdata{intcat;DATEcow;doubledog;floatname;}too;DATEmax;则语句printf("%d",sizeof(structdate)+sizeof(max));的执行结果是:__416_____分析:DATE是一个union变量公用空间.里面最大的变量类型是int[50],占用200个字节.所以它的大小是200,data是一个struct,每个变量分开占用空间.依次为int4+DATE200+double8+float4=216。所以结果是200+216=416;5.关于枚举类型举例说明枚举类型的作用,定义,使用技巧。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见。例如表示星期的SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,就是一个枚举。枚举的说明与结构和联合相似,其形式为:enum枚举名{标识符[=整型常数],标识符[=整型常数],...标识符[=整型常数],}枚举变量;如果枚举没有初始化,即省掉"=整型常数"时,则从第一个标识符开始,顺次赋给标识符0,1,2,…但当枚举中的某个成员赋值后,其后的成员按依次加1的规则确定其值。例如下列枚举说明后,x1,x2,x3,x4的值分别为0,1,2,3。enumstring{x1,x2,x3,x4}x;当定义改变成:enumstring{x1,x2=0,x3=50,x4,}x;则x1=0,x2=0,x3=50,x4=51注意:枚举中每个成员(标识符)结束符是",",不是";",最后一个成员可省略","。初始化时可以赋负数,以后的标识符仍依次加1。枚举变量只能取枚举说明结构中的某个标识符常量。例如:enumstring{x1=5,x2,x3,x4,};enumstrigx=x3;此时,枚举变量x实际上是7。enum关键字在c中用的是比较多的,它常用来定义标记整型常量,你去看许多操作系统的源代码,都有用这个关键字来一次定义许多标记整型常量,其实它相当于定义一个整型常量的表,当然他的大部分功能都可以被宏定义代替,不过毕竟enum关键字定义的东东是支持类型检查的,可以用编译器来发现一些错误(enum定义的只能是整型的常量表)6.关于联合体/共用体举例说明联合体(共同体)类型的作用,定义方法和使用技巧联合体是一种构造类型的数据,将不同类型的数据组织在相同的存储空间中,在同一个存储区中存放不同类型的数据定义:unionexam{inta;floatb;charc;}x;定义了联合体类型为unionexam,联合体变量为x开辟空间的大小为其中最大一个成员所占的空间。在同一时刻,联合体中只存放一个被选中的成员,对联合体的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了。联合体访问其成员也要用“->”,联合体名->成员名。联合体也可以出现在结构体内,其成员也可以是结构体,struct{Intagc;Char*addr;Union{IntI;Char*ch}x;}y[10];7.预编译的三个主要作用是什么?预编译是在程序编译之前由编译器进行的源代码处理工作。包括宏定义,文件包含,条件编译。宏定义作用:在预处理过程中将源程序中的标识符替换成字符串文件包含:在预处理过程中用包含文件的内容取代#include命令条件编译:#ifdef标识符如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。二、嵌入式IO操作1.不带缓存的IO操作什么是系统调用,什么是API?利用不带缓存的IO操作,的打开文件,关闭文件,读文件和写文件以及定位的函数分别是什么?系统调用:linux内核中设置了一组用于实现系统功能的子程序,成为系统调用。API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。打开,关闭,读写,定位文件的函数:open,close,read,write,lseekintopen(constchar*pathname,/*被打开的文件名(可包括路径名)*/constcharflags,/*文件打开的方式*/intperms);/*被打开文件的存取权限,为8进制表示法*/intclose(intfd);ssize_tread/write(intfd,/*文件描述符*/void*buf,/*指定存储器读出数据或写入数据的缓冲区*/size_tcount);/*指定读出或写入的字节数*/off_tlseek(intfd,/*文件描述符*/off_toffset,/*偏移量,每一个读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)*/intwhence);/*文件当前位置的基点*/ 2.带缓冲的IO操作带缓冲的什么是系统调用,什么是API?利用不带缓存的IO操作,的打开文件,关闭文件,读文件和写文件以及定位的函数分别是什么?打开文件有3个标准函数,分别为:fopen、fdopen和freopen。关闭标准流文件的函数为fclose读文件和写文件、定位:按字符读写:fgetc/getc/getcharfputc/putc/putchar按行读写:fgetsfputs/puts按指定格式读写:freadfwrite文件定位:fseek/rewindftell返回流式文件的当前位置三、进程通信1.进程和线程的差别。与进程的区别是什么?线程是指进程内的一个执行单元,也是进程内的可调度实体。(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。什么是进程,什么是进程控制块,什么是进程标识,如何获得进程标识PID。进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和消亡的整个过程,它是程序执行和资源管理的最小单位。进程控制块(PCB):系统为了管理进程设置的一个专门的数据结构,用它 来记录进程的外部特征,描述进程的运动变化过程。系统利用PCB来控制 和管理进程,所以PCB是系统感知进程存在的唯一标志。进程与PCB是一一对应的。进程标识:Linux内核通过惟一的进程标识值PID来标识每个进程。PID是各进程的代号,每个进程有唯一的PID编号。它是进程运行时系统随机分配的,并不代表专门的进程。在运行时PID是不会改变标识符的,但是你终止程序后再运行任务管理器后PID标识符就会改变。进程的运行状态有哪些,画出进程状态之间的转换逻辑图。进程状态(state)运行(TASK_RUNNING)可中断(TASK_INTERUPTIBLE)不可中断(TASK_UNINTERUPTIBLE)僵死(TASK_ZOMBIE)停止(TASK_STOPPED) Linux下一个进程主要包括哪三个段?它们的作用分别是什么?1/数据段,代码段,堆栈段2/数据段:存放全局变量、常数以及动态数据分配的空间(malloc函数取得的空间);代码段:存放程序代码;堆栈段:存放子程序的返回地址、子程序的参数以及程序的局部变量。Linux下的进程分为哪两种运行模式,两种模式之间是如何切换的?核心态和用户态通过系统调用,即操作系统向用户程序提供支持的接口,通过这些接口应用程序向操作系统请求服务,控制转向操作系统,而操作系统在完成服务后,将控制和结果返回给用户程序。通过系统调用从用户空间切换到内存空间,在内核空间完成相应的功能后,又在由用户空间切换到内核空间、Linux下如何启动一个进程?调度进程是对进程做哪些操作?fork()通过拷贝当前进程的内容创建一个子进程,子进程与父进程的区别仅仅在于不同的PID、PPID和其他一些资源。exec函数负责读取可执行文件并将其载入地址空间开始运行。根据优先级的范围,可以把进程分为实时进程(这里的实时是软实时)和普通进程。实时进程优先级高于普通进程,并由特定的调度策略来保证它们的(软)实时性。在调度时,系统总是首先选取具有最高优先级的并且拥有活跃进程的进程组,然后进行相同优先级下的进程调度。Linux下创建一个进程的函数是什么?如何判断创fork函数返回值是属于父进程或子进程?fork在创建一个新的进程时候,都复制了父进程的哪些内容?进程的创建:fork。执行一次却返回两个值,父进程的返回值是子进程的进程号,而子进程则返回0.intresult=fork();/*通过result的值来判断fork函数的返回情况,首先进行出错处理*/if(result==-1/*返回值为0代表子进程*/elseif(result==0)/*返回值大于0代表父进程*/else{/*父进程相关语句*/}子进程复制父进程的内容:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。用exec函数族启动一个进程和fork有什么异同点?在用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。fork函数用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是这个新创建的子进程不能执行其他代码。而exec函数可以在一个进程中启动另一个程序执行。它可以根据制定的路径和文件名找到可执行文件,并用它来取代原调用进程的数据段,代码段,堆栈段,在执行完后原调用进程的内容除了进程号外,其他全部被新的内容替换退出当前进程使用什么函数,等待子进程用什么函数?exit退出当前进程wait等待子进程什么是守护进程,它和普通进程有什么区别?守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。所有守护进程都以超级用户(用户ID为0)的优先权运行。没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组ID设置为-1。所有这些守护进程的父进程都是init进程四、进程间通信Linux统环境下,进程间通信主要包括哪几种方式?管道(pipe)和有名管道(fifo),信号(signal),消息队列,共享内存,信号量,套接字(socket)管道通信通过什么函数创建管道,创建管道的时候,fd[0]和fd[1]分别如何负责读写的。Pipe()函数fd[0]用于读取管道,fd[1]用于写入管道。父进程通过fork函数创建子进程,子进程通过fd【1】写入管道,父进程通过fd[0]读取管道,然后父进程在写,子进程读。关闭父进程fd[1]和子进程fd[0]信号通信的基本原理是什么?信号通信周期包括哪几个阶段。信号实在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件,它可以在任何时候发给某一进程,无需知道该进程的状态。如果进程当前未处于执行态,信号由内核保存起来,直到进程恢复执行再传递给它,如果一个信号被进程设置为阻塞,信号传递延迟,直到阻塞取消才被传递给进程。信号生命周期可以分为3个阶段,这3个阶段由4个时间刻画:信号产生,信号在进程中注册,信号在进程中注销,执行信号处理函数。内存共享主要用到那几个函数?这几个函数的功能是什么?Shmget:创建共享内存Shmat:映射共享内存,将创建的共享内存映射到具体的进程空间去。Shmdt:撤销映射操作,当一进程不再需要共享的内存段时,它将会把内存段从其地址空间中脱离。五、多线程什么是多线程多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度。多线程是多任务的特殊形式。通常,有两种类型的多任务:基于进程和基于线程的多任务。多线程和进程的区别和联系是什么?从概念上:进程:一个程序对一个数据的动态执行过程,是分配资源的基本单位。线程:一个进程内的基本调度单位从执行过程来看:进程:拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率线程:每一个独立的线程,都有一个程序运行的入口,顺序执行序列,程序的出口,但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度看:多线程的意义在于一个应用程序中,有多个执行部分可以同时执行,但是操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源分配。Linux的线程分为哪两种?线程按调度者可分为用户级线程和内核级线程Linux用什么函数创建一个新的线程并指定线程函数。如何退出当前运行的线程?用pthread_create函数创建一个新的线程,线程退出是用函数pthread_exit。pthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg)thread:线程标识符attr:线程属性设置start_routine:线程函数起始地址arg:传递给start_routine的参数pthread_exit(void*retval)retval:pthread_exit调用者线程的返回值,可由其他函数和pthread_join来检测获取。 网络通信1.socket网络通信常见的方式有哪几种?画出原理图?流式套接字,数据包套接字,原始套接字基于数据流的socket编程流程基于数据报的编程流程六、串口通信(ARM)什么是并行通信,什么是串行通信,串行通信设置中,一般要设置哪几个参数,它们分别代表什么意义。并行通信:在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。并行通信时数据的各个位同时传送,可以字或字节为单位并行进行。并行通信速度快,但用的通信线多、成本高,故不宜进行远距离通信。串行通信:串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。串口参数的配置主要包括:波特率、数据位、校验位,停止位。波特率,波特率是指每秒传输的符号数,若每个符号所含的信息量为1比特,则波特率等于比特率。数据位:数据位为5-8位,它紧跟在起始位之后,是被传送字符的有效数据位。传送时先传送字符的低位,后传送字符的高位。数据位究竟是几位,可由硬件或软件来设定。奇偶位:奇偶校验位仅占一位,用于进行奇校验或偶校验,也可以不设奇偶位。停止位:停止位为1位、1.5位或2位,可有软件设定。它一定是逻辑“1”电平,标志着传送一个字符的结束。七、数据结构部分(解释下列概念)1.数据结构概念数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。可以简单表示为:数据结构=数据+关系同一数据元素集合,所定一的关系不同,构成不同的数据结构。数据结构包括逻辑结构和存储结构两个方面。2.常见的数据结构存储结构:顺序结构,链式结构,散列存储结构,索引存储结构逻辑结构:集合结构,线性结构,树形结构,图状结构3.链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。4.堆栈堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意栈:后进先出5.队列队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。二叉树叶子,根节点,节点,深度,二叉树,平衡二叉树二叉树:是一种有序树,它是节点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。它的特点是每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。子叶:度为0的节点根节点:只有直接后继,没有直接前驱。(就是最顶层的节点)节点:表示树中的元素,包括数据元素的内容及其指向其子树的分支。深度:是指所有结点中最深的结点所在的层数。平衡二叉树: 平衡二叉树又被称为AVL树(区别于AVL算法,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。八、如何理解软件测试中常见的白盒测试和黑盒测试?软件测试黑盒偏重于功能性测试,不需要了解软件的内部逻辑结构;白盒测试偏重于软件内部逻辑结构的测试,需要了解程序内部的实际实现方式,相比较而言,白盒测试要求的技术性会高些技术性不强的话可以先从黑盒测试做起,逐渐进入白盒测试,其实测试重在实践,只要
chartemp=a[left];
a[left++]=a[right];
a[right--]=temp;
3.关于指针
(1)关键字const是什么含意?
下面的声明都是什么意思?
const意味着“只读”,表示该量在初始化后不能被重新修改。
constinta=20;//定义a为常整型数
intconstb=20;//定义b为常整型数
constint*c;//定义了一个指向常整型数的指针
int*constd=(int*)&a;//定义了指向整型数的常指针
constint*conste=(int*)0x3000;//定义了指向常整型数的常指针
(2)用变量a给出下面数据类型的一个定义
a)一个整型数(Aninteger);
inta;
b)一个指向整型数的指针(Apointertoaninteger);
int*a
c)一个指向指针的的指针,它指向的指针是指向一个整型数(Apointertoapointertoaninteger);
int**a
d)一个有10个整型数的数组(Anarrayof10integers);
inta[10]
e)一个有10个指针的数组,该指针是指向一个整型数的(Anarrayof10pointerstointegers);
int*a[10]
f)一个指向有10个整型数的数组的指针(Apointertoanarrayof10integers);
int(*a)[10]
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger);
int(*a)(int)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger);
int(*a[10])(int)
4.关于结构体
(1)设有以下说明和定义:
typedefunion{longi;intk[50];charc;}DATE;
structdata{intcat;DATEcow;doubledog;floatname;}too;
DATEmax;
则语句printf("%d",sizeof(structdate)+sizeof(max));的执行结果是:
__416_____
DATE是一个union变量公用空间.里面最大的变量类型是int[50],占用200个字节.所以它的大小是200,data是一个struct,每个变量分开占用空间.依次为int4+DATE200+double8+float4=216。
所以结果是200+216=416;
5.关于枚举类型
举例说明枚举类型的作用,定义,使用技巧。
枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见。
例如表示星期的SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,就是一个枚举。
枚举的说明与结构和联合相似,其形式为:
enum枚举名{
标识符[=整型常数],
...
}枚举变量;
如果枚举没有初始化,即省掉"=整型常数"时,则从第一个标识符开始,顺次赋给标识符0,1,2,…但当枚举中的某个成员赋值后,其后的成员按依次加1的规则确定其值。
例如下列枚举说明后,x1,x2,x3,x4的值分别为0,1,2,3。
enumstring{x1,x2,x3,x4}x;
当定义改变成:
enumstring
x1,
x2=0,
x3=50,
x4,
}x;
则x1=0,x2=0,x3=50,x4=51
注意:
枚举中每个成员(标识符)结束符是",",不是";",最后一个成员可省略","。
初始化时可以赋负数,以后的标识符仍依次加1。
枚举变量只能取枚举说明结构中的某个标识符常量。
例如:
x1=5,
x2,
x3,
};
enumstrigx=x3;
此时,枚举变量x实际上是7。
enum关键字在c中用的是比较多的,它常用来定义标记整型常量,你去看许多操作系统的源代码,都有用这个关键字来一次定义许多标记整型常量,其实它相当于定义一个整型常量的表,当然他的大部分功能都可以被宏定义代替,不过毕竟enum关键字定义的东东是支持类型检查的,可以用编译器来发现一些错误(enum定义的只能是整型的常量表)
6.关于联合体/共用体
举例说明联合体(共同体)类型的作用,定义方法和使用技巧
联合体是一种构造类型的数据,将不同类型的数据组织在相同的存储空间中,在同一个存储区中存放不同类型的数据
定义:
unionexam
floatb;
charc;
}x;定义了联合体类型为unionexam,联合体变量为x
开辟空间的大小为其中最大一个成员所占的空间。
在同一时刻,联合体中只存放一个被选中的成员,对联合体的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了。
联合体访问其成员也要用“->”,联合体名->成员名。
联合体也可以出现在结构体内,其成员也可以是结构体,
struct{
Intagc;
Char*addr;
Union{
IntI;
Char*ch
}y[10];
7.预编译的三个主要作用是什么?
预编译是在程序编译之前由编译器进行的源代码处理工作。
包括宏定义,文件包含,条件编译。
宏定义作用:
在预处理过程中将源程序中的标识符替换成字符串
文件包含:
在预处理过程中用包含文件的内容取代#include命令
条件编译:
#ifdef标识符
如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
二、嵌入式IO操作
1.不带缓存的IO操作
什么是系统调用,什么是API?
利用不带缓存的IO操作,的打开文件,关闭文件,读文件和写文件以及定位的函数分别是什么?
系统调用:
linux内核中设置了一组用于实现系统功能的子程序,成为系统调用。
API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
打开,关闭,读写,定位文件的函数:
open,close,read,write,lseek
intopen(constchar*pathname,/*被打开的文件名(可包括路径名)*/
constcharflags,/*文件打开的方式*/
intperms);/*被打开文件的存取权限,为8进制表示法*/
intclose(intfd);
ssize_tread/write(intfd,/*文件描述符*/
void*buf,/*指定存储器读出数据或写入数据的缓冲区*/
size_tcount);/*指定读出或写入的字节数*/
off_tlseek(intfd,/*文件描述符*/
off_toffset,/*偏移量,每一个读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)*/
intwhence);/*文件当前位置的基点*/
2.带缓冲的IO操作
带缓冲的什么是系统调用,什么是API?
打开文件有3个标准函数,分别为:
fopen、fdopen和freopen。
关闭标准流文件的函数为fclose
读文件和写文件、定位:
按字符读写:
fgetc/getc/getcharfputc/putc/putchar
按行读写:
fgetsfputs/puts
按指定格式读写:
freadfwrite
文件定位:
fseek/rewindftell返回流式文件的当前位置
三、进程通信
1.进程和线程的差别。
与进程的区别是什么?
线程是指进程内的一个执行单元,也是进程内的可调度实体。
(1)调度:
线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:
不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:
进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:
在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
什么是进程,什么是进程控制块,什么是进程标识,如何获得进程标识PID。
进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和消亡的整个过程,它是程序执行和资源管理的最小单位。
进程控制块(PCB):
系统为了管理进程设置的一个专门的数据结构,用它
来记录进程的外部特征,描述进程的运动变化过程。
系统利用PCB来控制
和管理进程,所以PCB是系统感知进程存在的唯一标志。
进程与PCB是一
一对应的。
进程标识:
Linux内核通过惟一的进程标识值PID来标识每个进程。
PID是各进程的代号,每个进程有唯一的PID编号。
它是进程运行时系统随机分配的,并不代表专门的进程。
在运行时PID是不会改变标识符的,但是你终止程序后再运行任务管理器后PID标识符就会改变。
进程的运行状态有哪些,画出进程状态之间的转换逻辑图。
进程状态(state)
运行(TASK_RUNNING)
可中断(TASK_INTERUPTIBLE)
不可中断(TASK_UNINTERUPTIBLE)
僵死(TASK_ZOMBIE)
停止(TASK_STOPPED)
Linux下一个进程主要包括哪三个段?
它们的作用分别是什么?
1/数据段,代码段,堆栈段
2/数据段:
存放全局变量、常数以及动态数据分配的空间(malloc函数取得的空间);
代码段:
存放程序代码;
堆栈段:
存放子程序的返回地址、子程序的参数以及程序的局部变量。
Linux下的进程分为哪两种运行模式,两种模式之间是如何切换的?
核心态和用户态
通过系统调用,即操作系统向用户程序提供支持的接口,通过这些接口应用程序向操作系统请求服务,控制转向操作系统,而操作系统在完成服务后,将控制和结果返回给用户程序。
通过系统调用从用户空间切换到内存空间,在内核空间完成相应的功能后,又在由用户空间切换到内核空间、
Linux下如何启动一个进程?
调度进程是对进程做哪些操作?
fork()通过拷贝当前进程的内容创建一个子进程,子进程与父进程的区别仅仅在于不同的PID、PPID和其他一些资源。
exec函数负责读取可执行文件并将其载入地址空间开始运行。
根据优先级的范围,可以把进程分为实时进程(这里的实时是软实时)和普通进程。
实时进程优先级高于普通进程,并由特定的调度策略来保证它们的(软)实时性。
在调度时,系统总是首先选取具有最高优先级的并且拥有活跃进程的进程组,然后进行相同优先级下的进程调度。
Linux下创建一个进程的函数是什么?
如何判断创fork函数返回值是属于父进程或子进程?
fork在创建一个新的进程时候,都复制了父进程的哪些内容?
进程的创建:
fork。
执行一次却返回两个值,父进程的返回值是子进程的进程号,而子进程则返回0.
intresult=fork();
/*通过result的值来判断fork函数的返回情况,首先进行出错处理*/
if(result==-1
/*返回值为0代表子进程*/
elseif(result==0)
/*返回值大于0代表父进程*/
else{
/*父进程相关语句*/
}
子进程复制父进程的内容:
进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。
用exec函数族启动一个进程和fork有什么异同点?
在用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序。
当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。
因为调用exec并不创建新进程,所以前后的进程ID并未改变exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。
fork函数用于创建一个子进程,该子进程几乎复制了父进程的全部内容,但是这个新创建的子进程不能执行其他代码。
而exec函数可以在一个进程中启动另一个程序执行。
它可以根据制定的路径和文件名找到可执行文件,并用它来取代原调用进程的数据段,代码段,堆栈段,在执行完后原调用进程的内容除了进程号外,其他全部被新的内容替换
退出当前进程使用什么函数,等待子进程用什么函数?
exit退出当前进程wait等待子进程
什么是守护进程,它和普通进程有什么区别?
守护进程(daemon)是生存期长的一种进程。
它们常常在系统引导装入时起动,在系统关闭时终止。
因为它们没有控制终端,所以说它们是在后台运行的。
所有守护进程都以超级用户(用户ID为0)的优先权运行。
没有一个守护进程具有控制终端—终端名称设置为问号(?
)、终端前台进程组ID设置为-1。
所有这些守护进程的父进程都是init进程
四、进程间通信
Linux统环境下,进程间通信主要包括哪几种方式?
管道(pipe)和有名管道(fifo),信号(signal),消息队列,共享内存,信号量,套接字(socket)
管道通信通过什么函数创建管道,创建管道的时候,fd[0]和fd[1]分别如何负责读写的。
Pipe()函数fd[0]用于读取管道,fd[1]用于写入管道。
父进程通过fork函数创建子进程,子进程通过fd【1】写入管道,父进程通过fd[0]读取管道,然后父进程在写,子进程读。
关闭父进程fd[1]和子进程fd[0]
信号通信的基本原理是什么?
信号通信周期包括哪几个阶段。
信号实在软件层次上对中断机制的一种模拟,是一种异步通信方式。
信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件,它可以在任何时候发给某一进程,无需知道该进程的状态。
如果进程当前未处于执行态,信号由内核保存起来,直到进程恢复执行再传递给它,如果一个信号被进程设置为阻塞,信号传递延迟,直到阻塞取消才被传递给进程。
信号生命周期可以分为3个阶段,这3个阶段由4个时间刻画:
信号产生,信号在进程中注册,信号在进程中注销,执行信号处理函数。
内存共享主要用到那几个函数?
这几个函数的功能是什么?
Shmget:
创建共享内存
Shmat:
映射共享内存,将创建的共享内存映射到具体的进程空间去。
Shmdt:
撤销映射操作,当一进程不再需要共享的内存段时,它将会把内存段从其地址空间中脱离。
五、多线程
什么是多线程
多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。
线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度。
多线程是多任务的特殊形式。
通常,有两种类型的多任务:
基于进程和基于线程的多任务。
多线程和进程的区别和联系是什么?
从概念上:
进程:
一个程序对一个数据的动态执行过程,是分配资源的基本单位。
线程:
一个进程内的基本调度单位
从执行过程来看:
进程:
拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率
每一个独立的线程,都有一个程序运行的入口,顺序执行序列,程序的出口,但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度看:
多线程的意义在于一个应用程序中,有多个执行部分可以同时执行,但是操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源分配。
Linux的线程分为哪两种?
线程按调度者可分为用户级线程和内核级线程
Linux用什么函数创建一个新的线程并指定线程函数。
如何退出当前运行的线程?
用pthread_create函数创建一个新的线程,线程退出是用函数pthread_exit。
pthread_create(pthread_t*thread,pthread_attr_t*attr,
void*(*start_routine)(void*),
void*arg)
thread:
线程标识符
attr:
线程属性设置
start_routine:
线程函数起始地址
arg:
传递给start_routine的参数
pthread_exit(void*retval)
retval:
pthread_exit调用者线程的返回值,可由其他函数和pthread_join来检测获取。
网络通信
1.socket网络通信常见的方式有哪几种?
画出原理图?
流式套接字,数据包套接字,原始套接字
基于数据流的socket编程流程基于数据报的编程流程
六、串口通信(ARM)
什么是并行通信,什么是串行通信,串行通信设置中,一般要设置哪几个参数,它们分别代表什么意义。
并行通信:
在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。
如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。
并行通信时数据的各个位同时传送,可以字或字节为单位并行进行。
并行通信速度快,但用的通信线多、成本高,故不宜进行远距离通信。
串行通信:
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。
其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。
串口参数的配置主要包括:
波特率、数据位、校验位,停止位。
波特率,波特率是指每秒传输的符号数,若每个符号所含的信息量为1比特,则波特率等于比特率。
数据位:
数据位为5-8位,它紧跟在起始位之后,是被传送字符的有效数据位。
传送时先传送字符的低位,后传送字符的高位。
数据位究竟是几位,可由硬件或软件来设定。
奇偶位:
奇偶校验位仅占一位,用于进行奇校验或偶校验,也可以不设奇偶位。
停止位:
停止位为1位、1.5位或2位,可有软件设定。
它一定是逻辑“1”电平,标志着传送一个字符的结束。
七、数据结构部分(解释下列概念)
1.数据结构概念
数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合。
可以简单表示为:
数据结构=数据+关系
同一数据元素集合,所定一的关系不同,构成不同的数据结构。
数据结构包括逻辑结构和存储结构两个方面。
2.常见的数据结构
存储结构:
顺序结构,链式结构,散列存储结构,索引存储结构
逻辑结构:
集合结构,线性结构,树形结构,图状结构
3.链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:
一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
4.堆栈
堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。
要点:
堆:
顺序随意栈:
后进先出
5.队列
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列中没有元素时,称为空队列。
二叉树
叶子,根节点,节点,深度,二叉树,平衡二叉树
二叉树:
是一种有序树,它是节点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。
它的特点是每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
子叶:
度为0的节点
根节点:
只有直接后继,没有直接前驱。
(就是最顶层的节点)
节点:
表示树中的元素,包括数据元素的内容及其指向其子树的分支。
深度:
是指所有结点中最深的结点所在的层数。
平衡二叉树:
平衡二叉树又被称为AVL树(区别于AVL算法,且具有以下性质:
它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
八、如何理解软件测试中常见的白盒测试和黑盒测试?
软件测试黑盒偏重于功能性测试,不需要了解软件的内部逻辑结构;
白盒测试偏重于软件内部逻辑结构的测试,需要了解程序内部的实际实现方式,相比较而言,白盒测试要求的技术性会高些
技术性不强的话可以先从黑盒测试做起,逐渐进入白盒测试,其实测试重在实践,只要
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1