2014025687《嵌入式系统程序设计》第五周学习总结
学号2014025687(29) 《嵌入式程序设计》第5周学习总结
教材学习内容总结
第六章6.5(标准I/O编程)
6.5.1基本操作
1.打开文件
打开文件有三个标准函数,分别为: fopen()、fdopen()和 freopen()。
(1)fopen()可以指定打开文件的路径和模式
函数原型:FILE * fopen(const char * path, const char * mode)
(2)fdopen()可以指定打开的文件描述符和模式
函数原型:FILE * fdopen(int fd, const char * mode)
(3)freopen()除可指定打开的文件、模式外,还可指定特定的I/O流。
函数原型:FILE * freopen(const char *path, const char * mode, FILE * stream)
2.关闭文件
关闭标准流文件的函数为 fclose(),该函数将缓冲区内的数据全部写入到文件中,并释放系统所提供的文件资源。
函数原型:int fclose(FILE * stream)
3.读文件
fread()在文件流被打开之后,可对文件流进行读写等操作,其中读操作的函数为 fread()。
函数原型:size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)
ptr:存放读入记录的缓冲区
size:读取的记录大小
nmemb:读取的记录数
stream:要读取的文件流
4.写文件
fwrite()函数用于对指定的文件流进行写操作。
函数原型:size_t fwrite(const void * ptr,size_t size, size_t nmemb, FILE * stream)
6.5.2其他操作
1.字符输入输出
字符输入输出函数一次仅读写一个字符。
函数原型(输出):int getc(FILE * stream) int fgetc(FILE * stream) int getchar(void)
函数原型(输入):int putc(int c, FILE * stream) int fputc(int c, FILE * stream) int putchar(int c)
2.行输入输出
行输入输出函数一次操作一行。
函数原型(输入):int puts(const char *s) int fputs(const char * s, FILE * stream)
函数原型(输出):char * gets(char *s) char fgets(char * s, int size, FILE * stream)
3.格式化输入输出
格式化输入输出函数可以指定输入输出的具体格式,这里有读者已经非常熟悉的 printf()、scanf()等函数。
int printf(const char *format,…)
函数原型(输出):
int fprintf(FILE *fp, const char *format,…)
int sprintf(char *buf, const char *format,…)
int vprintf(const char *format, va_list arg)
int vfprintf(FILE *fp, const char *format, va_list arg)
int vsprintf(char *buf, const char *format, va_list arg)
函数原型(输入):
int scanf(const char *format,…)
int fscanf(FILE *fp, const char *format,…)
int sscanf(char *buf, const char *format,…)
第七章7.1(Linux进程概述)
1.进程的定义
进程是一个程序的一次执行的过程,同时也是资源分配的最小单元。
进程和程序的区别:
它和程序是有本质区别的,程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念;而进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和消亡的整
个过程。它是程序执行和资源管理的最小单位。
2.进程控制块
在这里,是通过进程控制块来描述进程的变化。进程控制块包含了进程的描述信息、控制信息以及资源信息,它是进程的一个静态描述。在 Linux中,进程控制块中的每一项都是一个 task_struct结构,它是在 include/linux/sched.h中定义的。
3.进程的标识
进程标识有进程号和父进程号。其中 PID惟一地标识一个进程。PID和 PPID都是非零的正整数。
4.进程运行的状态
进程是程序的执行过程,根据它的生命周期可以划分成 3种状态。
执行态:该进程正在运行,即进程正在占用 CPU。
就绪态:进程已经具备执行的一切条件,正在等待分配 CPU的处理时间片。
等待态:进程不能使用 CPU,若等待事件发生(等待的资源分配到)则可将其唤醒。
5.Linux下的进程结构
Linux中的进程包含 3个段,分别为“数据段”、“代码段”和“堆栈段”。
6.Linux下进程的模式和类型
在 Linux系统中,进程的执行模式划分为用户模式和内核模式。
7.Linux下的进程管理
Linux下的进程管理包括启动进程和调度进程。
(1)启动进程
Linux下启动一个进程有两种主要途径:手工启动和调度启动。
(2)调度进程
调度进程包括对进程的中断操作、改变优先级、查看进程状态等。
7.2(linux进程控制编程)
1.fork()函数
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
2.exec族函数
它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了
3.exit()函数和_exit()函数
exit和_exit函数都是用来终止进程的。当程序执行到exit或_exit时,系统无条件的停止剩下所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。
exit()和_exit()的区别:
a._exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核。
b. 调用_exit函数时,其会关闭进程所有的文件描述符,清理内存以及其他一些内核清理函数,但不会刷新流(stdin, stdout, stderr ...). exit函数是在_exit函数之上的一个封装,其会调用_exit,并在调用之前先刷新流。
4.进程的wait()函数和waitpid()函数
当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件(这可以在父进程运行的任何时候发生),所以这种信号也是内核向父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数(信号处理程序)。对于这种信号的系统默认动作是忽略它)。
这两个函数的区别如下:
•在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
•waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以控制它所等待的进程。
教材学习中的问题和解决过程
许多概念如何在程序中运用的有点对不上,需要继续在编程上努力。
课后作业中的问题和解决过程
课本中有个代码编译错误通过比较其他类似的代码发现错误并改正了。
其他(感悟、思考等,可选)
学习要一步一步踏踏实实,遇到困难要把大困难化成小困难一步一步,不能放弃,解决问题越多,进步才越快。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 100/100 | 1/1 | 5/5 | |
第二周 | 200/300 | 1/2 | 5/10 | |
第三周 | 300/600 | 0/2 | 1/11 | |
第四周 | 600/1200 | 1/3 | 4/15 | |
第五周 | 200/1400 | 1/4 | 4/19 |
参考资料
- 《嵌入式应用程序设计》学习指导