课程设计报告
课程名称 系统软件实践 设计题目 Linux C 程序设计 专业、班级 软件1003班 学 号 100220071 姓 名 李超 指导教师 马睿 设计时间 2013年10月12日--2013年11月7日 2013年 10 月 27
1
日
一、 引言(简要说明设计题目的目的、意义、内容、主要任务等) a) 目的 i. 巩固和复习c语言的基础知识,进一步加深对c语言的理解和掌握 ii. 课程设计提供了一个既动脑又动手,独立实践的机会,将课本上得理论知识和实际 iii. 有机的结合起来,锻炼学生的分析解决实际问题的能力,提高学生适应实际,实践编程的能力; iv. 熟悉linux的基本操作,并且能够在linux环境下编写c语言程序、 v. 培养在项目开发中团队合作精神,创新意识及能力 b) 意义 i. 综合应用c程序设计课程的理论基础和知识,掌握程序设计的一般方法,树立正确的设计思想,培养了分析问题和解决问题的能力 ii. 学会了从实际的要求出发,合理的选择算法,正确的使用测试方法,培养了程序设计能力 iii. 学会运用帮助和查阅有关技术资料的能力。 c) 内容 程序一: 有一个已经从小到大排列好的数组,先输入一个数,要求按照原来的规律将它插入到数组中。并用make工程管理器编译。(注意分割文件,可参考第一题的提示。)编写makefile文件。 程序二: 设计两个程序,要求一个程序把三个人的姓名和帐号余额信息,通过一次流文件I/O操作写入文件“file”,另一个格式输出帐号信息,把每个人的帐号和余额一一对应显示输出。 程序三: 设计一个程序,要求复制进程,子进程显示自己的进程号(PID)后暂停一段时间,父进程等待子进程正常结束,打印显示等待的进程号(PID)和等待的进程退出状态。 程序四: 设计一个程序,要求创建一个管道,复制进程,父进程往管道中写入字符串,子进程从管道中读取并输出字符串 d) 主要任务 程序一:要求按照原来的规律将它插入到数组中。并用make工程管理器编译。(注意分割文件,可参考第一题的提示。)编写makefile文件。 程序二:要求设计两个程序,要求一个程序把三个人的姓名和帐号余额信息,通过一次流文件I/O操作写入文件“file”,另一个格式输出帐号信息,把每个人的帐号和余额一一对应显示输出。总结程序过程所用的相关知识(例如:语法,函数调用„„),分析解决程序运行过程出现的问题。写出程序代码的设计与运行结果。 程序三:要求子进程显示自己的进程号,然后暂停一段时间,等正常结束后,父进程打印显示等待的进程号以及等待的进程的退出状态。总结程序过程所用的相关知识(例如:语法,函数调用„„),分析解决程序运行过程出现的问题。写出程序代码的设计与运行结果。 程序四:此题目要求先创建一个管道,父进程往管道内写入一段字符串,子进程读取父进程写入的字符串并且输出。总结程序过程所用的相关知识(例如:语法,函数调用„„),分析解决程序运行过程出现的问题。写出程序代码的设计与运行结果。
2
二、 正文(课程设计的主要内容,包括实验与观测方法和结果、仪器设备、计算方法、编程原理、数据处理、设计说明与依据、加工整理和图表、形成的论点和导出的结论等。正文内容必须实事求是、客观真切、准确完备、合乎逻辑、层次分明、语言流畅、结构严谨,符合各学科、专业的有关要求。) 程序一: 程序描述: 主程序调用其他程序的方法进行数组的插入。先定义一个排好序的数组,然后输入一个数排序。程序应用makefile文件进行了文件的分割。 Makefile文件的作用:Makefile文件 Makefile 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 源程序: 4.c #include printf(\"\\n\"); } Makefile文件 main:4_1.o 4.o gcc 4_1.o 4.o -o a isDelta.o:4_1.c gcc 4_1.c -c main.o:4.c gcc 4.c –c 运行结果: 图1 排序 程序二: 程序描述: 程序主要实现了文件流的操作,分别调用了fwrite和fread函数,两个函数的定义详细介绍如下: Fwrite函数和fread函数:直接输入输出操作是以记录为单位进行读写,相应的库函数如下: 表头文件:#include 4 参数nmemb是所读记录的个数。 参数fp是指向要读取的流的FILE结构指针。 fwrite函数用于执行直接输入操作。 参数这ptr是指向存放要输入数据的缓冲区的指针。 参数size是写入记录的大小。 参数nmemb是所写记录的个数。 参数fp是指向要写入数据的流的FILE结构指针。 调用函数fread和fwrite 的返回值是实际读取或写入的记录数目。 这个返回值应当同nmemb的预设值相同。只有当到达文件的末尾(只有在读取操作时有此情况)或出现读写错误时,会造成返回值比设定的nmemb值小,甚至是负值的情况。这时系统内的文件结束标志或文件错误标志会被置为相应的值。 源程序: 2.c #include 5 fp=fopen(\"yinhang\fread(s,sizeof(struct test),nmemb,fp); fclose(fp); for(i=0;i 6 将原有的进程称为父进程,而把新生成的进程称为子进程。子进程是父进程的一个复制,子进程获得同父进程相同的数据,但是同父进程使用不同的数据段和堆栈段。 流程图: 源程序: #include 7 } 运行结果: 图3 存款 程序四: 程序描述:此程序主要实现了管道的创建,管道的读写操作。 (1)管道的创建: 表头文件:#include 8 EBADF 参数fd 非有效的文件描述词,或该文件已关闭。 write(将数据写入已打开的文件内) 表头文件:#include 9 close(fd[1]); waitpid(pid,NULL,0); } exit(0); } 运行结果: 图4父写子读 三、 结论(应当准确、完整、明确精练;也可以在结论或讨论中提出建议、设想、尚待解决问题等。) Makefile 介绍 make 命令执行时,需要一个Makefile 文件,以告诉make 命令需要怎么样的去编译和 链接程序。 信号是进程之间通信的一种方式。它包括3部分操作: 1.设置信号处理函数。系统调用signal。内核调用sys_signal(),设置当前进程对 某信号的处理函数。 2.发送信号.系统调用kill。内核调用sys_kill()。向目标进程发送信号。 3.接收并处理信号。目标进程调用do_signal()处理信号。 从用户态的角度看,目标进程在执行用户态的代码时突然“中断”,转而去执行对应的信号处理函数(同样在用户态)。等到信号处理函数执行完后,又从原来被中断的代码开始执行。 如何达到这样的效果呢?由前面的几种内核的伪装现场的手段,我们可以猜出它这次 使用的手段。比如,要让目标进程执行信号处理函数,在内核态中当然不可能直接调用,但 是可以通过设置pt_regs中的eip来达到这种效果。但是,要使目标进程在执行完信号处理 函数后,又恢复到被中断的现场继续执行,那得花些技巧。不过,不外乎设置堆栈。这一次 还包括了用户态堆栈。由于恢复的任务比较艰巨,系统干脆提供了一个系统调用sigreturn 。 既然内核希望用户在执行完信号处理函数后,调用sigreturn。接下去的思路就比较 简单了。就是先把用户态的eip设置为signal_handler(通过修改pt_regs中的eip来实 现),然后把堆栈中的返回地址改成调用sigreturn的一段代码的入口(当然原来的返回地 址也还是要保存的)并且把相关参数“压入”用户态堆栈。 10 这样,在源进程发送信号后不久,目标进程被调度到,然后执行到do_signal。对信 号一一作处理. pram——指定了RAM起始的物理地址,必须始终存在,并应等于PHYS_OFFSET。 pio——是供arch/arm/kernel/debug-armv.S中的调试宏使用的,包含IO的8 MB区域的物理地址。 vio——是8MB调试区域的虚拟地址。这个调试区域将被位于代码中(通过MAPIO函数)的随后的构架相关代码再次进行初始化。 l FⅨUP(func) ——机器相关的修正,在存储子系统被初始化前运行。 lMAPIO(func) ——机器相关的函数,用于IO区域的映射(包括上面的调试区)。 l INITIRQ(func) ——用于初始化中断的机器相关的函数。 四、 参考文献 [1]贾宗璞,许合利.C语言程序设计[M].江苏:中国矿业大学出版社,2007. [2]谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,2001. [3]谭浩强,张基温,唐永炎编著. C语言程序设计教程[M].北京:高等教育出版社,1992. [4]秦友淑,曹化工编著.C语言程序设计教程[M].武汉:华中理工大学出版社,1996. [5]曹衍龙,林瑞仲,徐慧 编著.C语言实例解析精粹[M]. 北京:人民邮电出版社,2005. [6]黄明等编著.C语言程序设计[M].大连。大连理工大学出版,1996. 五、 指导教师评语 签名: 年 月 日 课程设计成绩(五级分制) 11 因篇幅问题不能全部显示,请点此查看更多更全内容