嵌入式操作系统应用开发复习题及答案_第1页
嵌入式操作系统应用开发复习题及答案_第2页
嵌入式操作系统应用开发复习题及答案_第3页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、简述Linux操作系统具有的特点。答:开放的源代码,良好的兼容性,完备的帮助手册页,优秀的网络支持支持多用户多任务多处理器支持多种文件系统,独特的挂载方式确保数据的安全性将应用程序的核心实现为库,可重用性良好采用模块化分层的程序设计方法,可靠易维护将设备等一切都看做是文件,提供统一的文件操作接口对设备等进行操作2、解释POSIX。答:POSIX表示可移植操作系统接口,可以提高UNIX环境下应用程序的可移植性。POSIX标准定义了标准的API,只要是符合这一标准的应用程序,就能够在多种操作系统中运行。3、解释通用公共许可证GPL。答:GPLGPLGPLGPL码,允许被修改。4、Linux系统下,常用的在线帮助文件有哪些?答:1、man手册2、info手册3、How-To。5、Linux系统下进行C程序开发的主要两个标准。答:1、ANSIC标准2、POSIX标准。6、Linux统全局变量进行赋值,以指示具体的错误情况。0,不成功时一般返回-10errno值指示错误类型应用程序库函数系统调用内核硬件设备7Linux函数库调用和系统调用的示意图,简单说明系统调用(应用程序库函数系统调用内核硬件设备APIAPI务。API同时保证了操作系统数据和程序的安全性。因此,API提供给用户安全地使用操作系统提供的服务。8、简单说明在Linux程序开发过程中,利用GCC工具将C语言程序编译成一个可执行程序文件的四个步骤。答:1、预处理2、编译3、汇编4、连接9、解释gcc工具的o、c、I、L、l等5个参数的功能作用。output_filenamec:I:L:dirname录l:-o file file-c .o(OBJ)文件-Idirname dirname目录-Ldirname 在“-I”的搜索目录中添加dirname目录,在连接库文件时候使用-lnamelibname.连接,省略库名中的前缀“lib”和后缀“.a”10、可执行程序文件在存储时(没有调入到内存)分为几部分,说明各段的主要内容。(text):存放CPU2(data)被初始化的全局变量和静态变量。3、未初始化数据区(bss):未初始化的全局变量和静态变量,在程序开0或空指针。11、可执行程序文件调入到内存产生进程后,分为几个存储区域,说明各区域的主要内容与作用。答:前三个与10中内容相同4、堆区:用于动态内存分配5、栈区(heap):由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。。12LinuxC答:ANSIC2.3.具有更好的兼容性率比系统调用要低POSIX优点:在类UNIX等系统中有很好的可移植性,可以直接设置对硬件的控制缺点:1.使用时会影响系统性能,如果一次只存取很少的内容,效率会很低2.硬件会限制对底层系统调用一次能读写的数据块大小,如果数据很小,会留下空隙。3.兼容性不是很好13、Linux系统中,系统默认为每个进程打开了几个个文件?即每个进程可以直接操作哪几个流?答:3个,STDIN_FILENO标准输入文件,STDOUT_FILENO标准输出文件,STDOUT_FILENO标准错误文件。每个进程可以直接操作STDIN:标准输入流,STDOUT标准输出流,STDERR:标准错误输出流。14open()整数用于表示该打开的文件,内核通过文件描述符对文件进行操作。ANSICfopen打开一个文件后返回一个文件流指针与该文件关联,所有对该文件的读写操作都可以通过该指针流完成。在Linux了文件描述符,才能使通过文件流指针对文件操作成为可能。15、Linux文件类型,在shell应用层面用ls-l查看命令不同类型的文件分别显示什么内容?答:文件的类型,文件权限,应连接个数,拥有者,拥有者所在组,文件大小,最后一次修改时间。文件类型标识:目录文件d,普通文件f,字符设备文件c,块设备文件b,管道文件p,链接文件l,socket文件s16Linux么?答:索引节点,文件描述符。17、ls–lc,-lu,-lt分别列出的是什么时间?答:–lc:最后一次修改i结点时间.-lu:最后一次访问时间.-lt:最后一次修改内容时间18、一个文件设置了setuid位,该可执行文件在执行时有什么主要的影响。19、一个常规文件的大小可以为(st_size字段定义,那么目录和符号连接的长度是否可以为0?答:不为0.因为每当目录文件创建时,会自动产生两个“.”开头的隐含文件,符号链接,文件包含着另一个文件的路径名。20、Linux系统下,进程结束的方法有哪几种?答:1.在本进程或者其它进程中使用kill()调用发送SIGKILL信号。2.进程运行过程中遇到内存段冲突,非法指令等错误,由操作系统发送相应的信号终止进程。3.进程执行到return或者调用exit()或者运行到最后自然结束。4.执行exec类函数执行新的进程21、Linux系统下,线程结束的方法有哪几种?、调用pthread_exit()2、调用pthread_cancel34exec5.线程调用pthread_exit()或者执行到return6.线程执行中出错由系统终止22?答:1.2.互斥量3.23?信号3.管道(包括有名管道和无名管道)4.内存网络通信:1.socket2.rpc24(TCP)socketsocket答:read/recvwrite/send

write/sendread/recvsocket():创建一个socket,作为通信的一个端点bind():socketAF_INETIPAF_UNIX其关联到一个文件系统的路径名listen():创建一个队列用来保存等待处理的连接accept():阻塞等待连接请求,在有连接请求时创建一个新的socket来与客户进行通信recv()/read():接收数据send()/write():发送数据connect():用户通过在一个命名的或者未命名的socket和服务器的socket建立连接25、画出面向非连接的(UDP)socket通信模型,并解释说明其中主要的socket函数。recvfromsendto

sendtorecvfromsocket,bind26、Linux系统IO操作有哪几种方式?答:1、阻塞I/O2、非阻塞I/O3、多路选择I/O4、信号驱动I/O27、字节排列顺序有几种方式?答:大端方式,小端方式的正常思维,而采用小端方式进行数据存放利于计算机处理。28、POSIX标准下,文件管理的基本操作函数有哪些?open打开文件close关闭文件read(从文件或设备中读读数据write(向文件或者设备中写数据fcntl():传递控制信息到设备驱动程序编程29ANSICfile.infile.out中#include<stdio.h>#include<stdlib.h>intmain(){intc;FILE*in,*out; //定义两个文件流指针in=fopen("file.in","r"); //in与file.in文件关联,使用只读方式打开out=fopen("file.out","w"); //out与file.out文件关联,用只写方式打while((c=fgetc(in))!=EOF)fputc(c,out); //file.infgetc()ccfile.out果没有读到文件尾EOF,就继续下一次循环exit(0);}30POSIXIO答:#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>#include<fcntl.h>#include<stdlib.h>intmain(){intc[50]; //file.in中读出的字符intin,out;intnread; //存放read()返回值,即成功读取的字符数in=open("file.in",//以只读方式打开file.inout=open("file.out",|S_IRUSR|S_IWRUSR); //该文件不存在,就使用所有者可读可写的方式创建它while((nread==read(in,c,50))>0) //请求从file.in50cnread中write(out,c,nread); //c中的有效字符写入file.out0(即已经读完了所有字符,退出循环if(nread<0) //如果返回值为-1,出现错误,在终端输出“read()write(2,"read()error!",13);exit(0);}31、如何编程实现文件夹的拷贝。答:/*输入格式如./cpfilefile1file2*/#include<stdio.h>#include<stdlib.h>#include<sys/stat.h>#include<sys/types.h>#include<ftw.h>#include<fcntl.h>#include<unistd.h>#include<limits.h>#include<string.h>#include<dirent.h>#defineBUFSIZE1024#definePERMS0666#defineDUMMY0intcpfile(char*source_file,char*target_file){intsource,target,num;chariobuffer[BUFSIZE];if((source=open(source_file,O_RDONLY,DUMMY))==-1){printf("Sourcefileopenerror!\n");return1;}if((target=open(target_file,O_WRONLY|O_CREAT,PERMS))==-1){printf("Targetfileopenerror!\n");return2;

}while((num=read(source,iobuffer,BUFSIZE))>0)if(write(target,iobuffer,num)!=num){printf("Targetfilewriteerror!\n");return3;}close(source);close(target);return0;}intcpdir(char*source_dir,char*target_dir){DIR*source=NULL;DIR*target=NULL;structdirent*ent=NULL;char name1[100],name2[100];source=opendir(source_dir);mkdir(target_dir,S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH);target=opendir(target_dir);if(source!=NULL&&target!=NULL){while((ent=readdir(source))!=NULL){if( strcmp(ent->d_name,"..")!=0&&strcmp(ent->d_name,".")!=0){strcpy(name1,"\0");strcat(name1,source_dir);strcat(name1,"/");strcat(name1,ent->d_name);strcpy(name2,"\0");strcat(name2,target_dir);strcat(name2,"/");strcat(name2,ent->d_name);if(ent->d_type==4)cpdir(name1,name2);if(ent->d_type==8)cpfile(name1,name2);

要传输的数据charbuffer[BUFSIZ+1]; //stdio.hBUFSIZ8Kpid_tfork_result;memset(buffer,'\0',sizeof(buffer)); //buffer空间初始化‘\0’if(pipe(file_pipes)==0){fork_result=fork();if(fork_result==-1){fprintf(stderr,"Forkfailure");exit(EXIT_FAILURE);}} //bufferr中} if(fork_result==0){}return0;}

closedir(source);closedir(target);

data_processed=read(file_pipes[0],buffer,BUFSIZ);printf("Read %d bytes: data_processed,buffer);exit(EXIT_SUCCESS);}intmain(intargc,char*argv[]){cpdir(*(argv+1),*(argv+2));return0;}写一创建(fork)新进程的程序,利用管道机制,据。答:#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<string.h>intmain(){intdata_processed;intfile_pipes[2]; //管道的描述符constcharsome_data[]="123"; //存放将

//父进程往管道中写入数据else{data_processed=write(file_pipes[1],some_data,strlen(some_data));printf("Wrote %d data_processed);}}exit(EXIT_SUCCESS);}32、编程实现who|sort答:#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<fcntl.h>#include<sys/wait.h>#include<stdlib.h>intmain(intargc,char*argv[])else{{if(fork()==0)intfds[2];{if(pipe(fds)==-1)dup2(fds[1],1);{close(fds[0]);perror("pipe");execlp("who","who",(char*)0);exit(EXIT_FAILURE);}}elseif(fork()==0){{close(fds[0]);charbuf[128];close(fds[1]);dup2(fds[0],0);wait(NULL);close(fds[1]);//mustwait(NULL);include,orblock}execlp("sort","sort",(char*)0);}//execlp("cat","cat",(char*)0);return0;}}33、利用信号机制,定时在屏幕上输出一些信息。答:#include<unistd.h>#include<signal.h>#include<sys/types.h>#include<stdlib.h>#include<stdio.h>//方法1:使用系统调用alarm()发送SIGALRMstaticintalarm_fired=0;//设置标志位voidding(intsig)//printf()这个不安全的函数,在函数中设置标志main()printf()输出信息{alarm_fired=1;}

alarm(5); //5s之后发送一个SIGALRM信号sleep(10); //进程休眠,等待信号到达if(alarm_fired==1)//信号是否是SIGALRM,如果是,输出信息printf("5secondspast!Ding!\n");}//方法2:使用系统调用kill()发送SIGALRMstaticintalarm_fired=0;//设置标志位voidding(intsig)//printf()这个不安全的函数,在函数中设置标志main()printf()输出信息intmain(){(void)signal(SIGALRM,ding);//注册信号处理函数(被分栏了,下页继续)

{alarm_fired=1;}intmain() }{pid_tpid;pid=fork();switch(pid){case-1:perror("forkerror");exit(1);case0://进入子进程sleep(5);//子进程进入休眠等待父进程注册好信号处理函数并等待信号到达kill(getppid(),SIGALRM);//通过getppid()得到父进程pid,向父进程发送SIGALRM信号exit(0);//信号发送完毕,子进程退出

//下边由父进程执行printf("waitingforSIGALRMtocome!\n");(void)signal(SIGALRM,ding);//注册用于捕获SIGALRM的信号处理函数pause();//等待信号到达if(alarm_fired==1)//通过标志位判断到达的信号是是否是SIGALRM,如果是,输出信息printf("timeout!\n");printf("Done.\n");exit(0);}34、利用信号量机制,实现生产消费问题的基本程序框架。答:消费者#include<unistd.h>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<sys/types.h>#include<sys/sem.h>#include<sys/shm.h>#defineSHARED_SIZE1024staticcharshm[SHARED_SIZE];unionsemun{intval;};voidsem_set(intsemid){unionsemunsem_un;sem_un.val=0;//为互斥锁使用semctl(semid,0,SETVAL,&sem_un);}

voidsem_p(intsemid){structsembufsem_buf;sem_buf.sem_num=0;sem_buf.sem_op=-1;sem_buf.sem_flg=SEM_UNDO;semop(semid,&sem_buf,1);}voidsem_v(intsemid){structsembufsem_buf;sem_buf.sem_num=0;sem_buf.sem_op=1;sem_buf.sem_flg=SEM_UNDO;semop(semid,&sem_buf,1);}intmain(){intshmid;intsemid;char*shared_stuff=(char*)0;void*shared_memmory=(void*)0;semid = semget((key_t)2345, 1, 0666 srand((unsignedint)getpid());//创建一个shm大小的共享区,该共享区和shm数据结构相同shmid = shmget((key_t)1234, 0666|shared_memmory=shmat(shmid,(void*)0,0);shared_stuff=(char*)shared_memmory;//通过指向共享存储区的指针使用该共享区sem_p(semid);//阻塞自己,等待生产者进程中的sem_v操作while(1){if(strncmp("end",shared_stuff,3)!=0){printf("消费者从共享区中得到的数据为:%s\n",shared_stuff);sem_p(semid);//}else{printf("运行结束!\n");break;}}//shmdt(shared_memory);//断开和共享内存间的链接 都由生产者删除这些好~~~~~//shmctl(shmid,IPC_RMID,0);//删除这个共享内存exit(EXIT_SUCCESS);}生产者

intmain(){intshmid;intsemid;char*shared_stuff=(char*)0;void*shared_memmory=(void*)0;semid = semget((key_t)2345, 1, 0666 IPC_CREAT);sem_set(semid);/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论