《嵌入式程序设计》第六周学习总结

《嵌入式程序设计》第六周学习总结

教材学习总结

一.Linux 进程间通信方式 (1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 (2)信号(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。 (3)消息队列(Messge Queue):消息队列是消息的链接表,包括 Posix 消息队列 SystemV 消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息。 (4)共享内存(Shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。 (5)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。 (6)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。 二.管道 1.特点 ①它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。 ②它是一个半双工的通信模式,具有固定的读端和写端。 ③ 管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read()和 write()等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内核的内存空间中。 2.管道创建函数 pipe()函数语法

| |
| -------- | :----------------😐
|所需头文件 | #include <unistd.h> |
|函数原型 | int pipe(int fd[2]) |
|函数传入值 |fd[2]:管道的两个文件描述符,之后就可以直接操作这两个文件描述符|
|函数返回值 | 成功: 0 出错:-1|

3.管道读写注意点
①只有在管道的读端存在时,向管道写入数据才有意义。否则,向管道写入数据的进程将收到内核传来的 SIGPIPE 信号(通常为 Broken pipe 错误)。
②向管道写入数据时, Linux 将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读取管道缓冲区中的数据,那么写操作将会一直阻塞。
③ 父子进程在运行时,它们的先后次序并不能保证,因此,在这里为了保证父子进程已经关闭了相应的文件描述符,可在两个进程中调用 sleep()函数。

三.标准流管道
1.标准流管道就将一系列的创建过程合并到一个函数 popen()中完成。它所完成的工作有以下几步。
① 创建一个管道
② fork()一个子进程
③ 在父子进程中关闭不需要的文件描述符
④ 执行 exec 函数族调用
⑤ 执行函数中所指定的命令
2.popen()和 pclose()函数
①popen()函数

| |
| -------- | :----------------😐
|所需头文件 |#include <stdio.h>|
|函数原型 |FILE *popen(const char *command, const char *type)|
|函数传入值|command:指向的是一个以 null 结束符结尾的字符串,这个字符串包含一个 shell 命令,并被送到/bin/sh 以-c 参数执行,即由 shell 来执行|
|函数传入值| type:“r”:文件指针连接到 command 的标准输出,即该命令的结果产生输出“w”:文件指针连接到 command 的标准输入,即该命令的结果产生输入|
|函数返回值|成功:文件流指针 出错:-1|

②pclose()函数语法要点

| |
| -------- | :----------------😐
|所需头文件 |#include <stdio.h>|
|函数原型 |int pclose(FILE *stream)|
|函数传入值| stream:要关闭的文件流|
|函数返回值|成功:返回由 popen()所执行的进程的退出码 出错:-1|

四.阻塞打开和非阻塞打开的读写
(1)对于读进程。
①若该管道是阻塞打开,且当前 FIFO 内没有数据,则对读进程而言将一直阻塞到有数据写入。
②若该管道是非阻塞打开,则不论 FIFO 内是否有数据,读进程都会立即执行读操作。即如果 FIFO
内没有数据,则读函数将立刻返回 0。
(2)对于写进程。
①若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
②若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 15 20/20
第一周 200/200 2/2 1/1 vi的使用
第二周 1000/1200 3/7 7/8 gcc,gdb,makefile
第三周 500/1700 1/8 4/12 U-Boot
第四周 1500/3200 1/9 6/18 Linux的内核
第五周 1200/4400 1/10 3/21 标准I/O的编程,linux下进程相关的基本系统调用
第六周 1000/5400 1/11 4/25 进程间通讯

参考资料

  • 《嵌入式Linux应用程序开发标准教程》
posted @ 2017-05-28 14:45  黑麦威士忌  阅读(141)  评论(0编辑  收藏  举报