2014025628《嵌入式系统程序设计》第五周学习总结

本周学习内容

1、fread函数和fwrite函数的每个参数的含义

fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出。
(1)size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

     其中,ptr:指向保存结果的指针;size:每个数据类型的大小;count:数据的个数;stream:文件指针

     函数返回读取数据的个数。

(2)size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

     其中,ptr:指向保存数据的指针;size:每个数据类型的大小;count:数据的个数;stream:文件指针

     函数返回写入数据的个数。

2、fread和fwrite函数的使用

fwrite和fread可以将一个字符串写入文件,也可将一个字符数组,一个整型数组写入文件。由于程序生成的文件是二进制文件而非文本文件,因此,不用机器,整数的表达不同,所以无法直接打开生成文件。可通过fread函数检验数据是否写入文件。

3、 创建进程函数fork()

一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。
每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。

4、exec族函数

说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是:
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。
exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。

5、终止进程的exit()函数和_exit()函数

exit()函数与_exit()函数最大的区别就在于exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是"清理I/O缓冲"。

_exit()函数的作用最为简单:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
exit()在结束调用它的进程之前,要进行如下步骤:
1.调用atexit()注册的函数(出口函数);按ATEXIT注册时相反的顺序调用所有由它注册的函数,这使得我们可以指定在程序终止时执行自己的清理动作.例如,保存程序状态信息于某个文件,解开对共享数据库上的锁等.
2.cleanup();关闭所有打开的流,这将导致写所有被缓冲的输出,删除用TMPFILE函数建立的所有临时文件.
3.最后调用_exit()函数终止进程。

6、终止(中断)进程的wait()函数和waitpid()函数

wait()头文件:

#include <sys/types.h> #include <sys/wait.h>
定义函数:
pid_t wait (int * status);
wait()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经结束, 则wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数status 返回, 而子进程的进程识别码也会一快返回. 如果不在意结束状态值, 则参数 status 可以设成NULL. 子进程的结束状态值请参考waitpid().

waitpid()头文件:
#include <sys/types.h> #include <sys/wait.h>
定义函数:
pid_t waitpid(pid_t pid, int * status, int options);
waitpid()会暂时停止目前进程的执行, 直到有信号来到或子进程结束. 如果在调用wait()时子进程已经结束, 则wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数status 返回, 而子进程的进程识别码也会一快返回. 如果不在意结束状态值, 则参数status 可以设成NULL. 参数pid 为欲等待的子进程识别码

本次实验遇到的问题:

女生寝室只有四个人,在最开始的#define SIZE 6这一句应该设置成#define SIZE 4

书上代码不全对,百度了一下才修改成正确的代码

时间: 2024-10-11 21:56:43

2014025628《嵌入式系统程序设计》第五周学习总结的相关文章

2014025670(12)《嵌入式系统程序设计》第二周学习总结

这周学习了gcc和gdb的使用还有makefile. 教材学习内容总结 教材内容开始看的有些吃力,很多地方都不太懂,网上查询和询问同学和老师之后,了解了很多,但是具体操作和实现方面还是比较难. 教材学习中问题和解决过程 对于gcc的操作在实验楼的学习中还是比较顺利,gdb的操作感觉有些村存在问题-----gdb的调试方面有些吃力,应该是自己没努力的结果,打算把问题汇总一下,再试试实验. 课后作业中的问题和解决过程 应用实验楼的第二周,第一周的内容感觉简单,消化很快,没想到第二周就感觉有些吃力,不

2014025663(05)《嵌入式系统程序设计》第二周学习总结

教材学习内容总结 在这一周里我通过课上与课下熟悉了VI编辑器的各种操作.gcc的有效应用,通过gcc来编译C语言程序!其主要分为4大步分为预处理.编译.汇编和链接. 也学会了Makefile的使用! 教材学习中的问题和解决过程 本周的出现的主要问题在于 GCC前不能加除Tab外任何东西,否则会影响到文件的编译! 代码调试中的问题和解决过程 代码暂时没有什么问题! 课后作业中的问题和解决过程 我在多次使用与试用!成功了解博客园 实验楼 网站! 其他(感悟.思考等,可选) 我们要对学校这门课有足够的

2014025660《嵌入式系统程序设计》第二周学习总结

本周学习过程中,学习运用gcc和gdb的编程,在实验过程中,编辑c文件,对文件类型进行转换,由于实验过程中,代码出现了错误,浪费了大量的时间查找代码的错误. 在Makefile的实验过程中,运用vi分别编辑hello.c文件hello.h,以及Makefile文件,最后运应用make -f makefile1显示 make hello是最新的.

2014025658《嵌入式系统程序设计》第二周学习总结

本周所学内容如下: 1.学会使用gcc编译器: 2.学会使用GDB调试器: 3.学会C程序的编写(包括系统调用和函数调用) 4.学会Makefile基本规则: 5.学会make命令的使用方法: 6.学会使用Makefile程序的编写. 7.使用gcc编译器编译C语言程序文件生成可执行文件的过程,是要经历四个相互关联的步骤:预处理.编译.汇编和链接. 8.gdb是GNU开源组织开发的一个强大的Linux下的程序调试工具,它主要完成:启动被调试程序,按照要求运行程序.让被调试的程序在指定的位置停住.

201405644 嵌入式程序设计第五周学习总结

嵌入式课程设计第五周学习总结 标准 I/O 编程 标准 I/O 提供流缓冲的目的是尽可能减少使用 read()和 write()等系统调用的数量.标准 I/O 提供了 3 种类型 的缓冲存储.全缓冲.行缓冲.不带缓冲. 打开文件 打开文件有三个标准函数,分别为:fopen().fdopen()和 freopen().其中 fopen()可以指定打开文件的路径和模式,fdopen()可以指定打开的文件描述符和模式,而 freopen() 除可指定打开的文件.模式外,还可指定特定的 I/O 流. f

嵌入式系统程序设计第三周实验总结

第三周是我相对于前两周收获的最多的一周,我开始认真听课,老师上课让跟着打的程序也能很好的跟上,不再说都不会不听了或者怎么样的 实验楼第二次做还是有点不太熟悉但是一些基本的东西都能操作 本次实验楼的程序结果如下

20145234黄斐《信息安全系统升级系统》第五周学习总结

教材内容概述 3.1 历史观点 X86 寻址方式经历三代: 1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全2 8086的分段模式3 IA32的带保护模式的平坦模式 3.2 程序编码 计算机系统使用了多种不同的抽象,对机器级编程来说,两种抽象尤为重要: 机器级程序的格式和行为,定义为"指令集体系结构"--"ISA" 机器级程序使用的存储器地址是虚拟地址 可见的处理器状态 程序计数器 指示将要执行的下一条指令在存储器中的位置 整数寄存器文件包含8个命名的位

2014025689 《嵌入式系统程序设计》第五周学习总结

<嵌入式系统程序设计>第五周学习总结 一.6.5(标准I/O编程)主要涉及的函数及知识点 标准的I/O的三种缓冲存储:全缓冲.行缓冲.不带缓冲. 1. 全缓存:当填满标准I/O缓存后才进行实际的I/O操作 2. 行缓存:当输入或输出中遇到行结束符时,标准I/O库执行I/O操作 3. 不带缓存:标准I/O库不对字符进行缓冲 打开文件的三个标准函数:  fopen().fdopen()和 freopen(). -fopen()可以指定打开文件的路径和模式 函数原型:FILE * fopen(con

2014025665《嵌入式系统程序设计》第三、四周学习总结

第三周1.我们在带三周的嵌入式程序设计中学到了如何搭建嵌入式Linux交叉开发环境.其实主要是解决64位系统下如何安装32位程序的问题.①若联网:Syum install Id-Linux.so.2②若不联网:Srpm-ivhg libc.rpm nss.rpm还有测试arm-Linux-gcc是否编译等问题.第二节课学的是如何配置PATH将工具链加入到PATH中:方法一:$export PATH=$PATH;/usr/local/arm/gcc-3.4.6-glibc-2.3.6/bin方法二

2014025669《嵌入式系统程序设计》第三,四周学习总结

第三周1.我们在带三周的嵌入式程序设计中学到了如何搭建嵌入式Linux交叉开发环境.其实主要是解决64位系统下如何安装32位程序的问题.①若联网:Syum install Id-Linux.so.2②若不联网:Srpm-ivhg libc.rpm nss.rpm还有测试arm-Linux-gcc是否编译等问题.第二节课学的是如何配置PATH将工具链加入到PATH中:方法一:$export PATH=$PATH;/usr/local/arm/gcc-3.4.6-glibc-2.3.6/bin方法二