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

学习总结

有名管道说明

在创建管道成功之后,就可以使用 open()、read()和 write()这些函数了。与普通文件的开发设置一样,对于
为读而打开的管道可在 open()中设置 O_RDONLY,对于为写而打开的管道可在 open()中设置 O_WRONLY,
在这里与普通文件不同的是阻塞问题。由于普通文件的读写时不会出现阻塞问题,而在管道的读写中却有
阻塞的可能,这里的非阻塞标志可以在 open()函数中设定为 O_NONBLOCK。下面分别对阻塞打开和非阻
塞打开的读写进行讨论。

(1)对于读进程。

若该管道是阻塞打开,且当前 FIFO 内没有数据,则对读进程而言将一直阻塞到有数据写入。
若该管道是非阻塞打开,则不论 FIFO 内是否有数据,读进程都会立即执行读操作。即如果 FIFO
内没有数据,则读函数将立刻返回 0。

(2)对于写进程。

若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。

mkfifo()函数格式

所需头文件 include <sys/types.h>
include <sys/state.h>
函数原型 int mkfifo(const char *filename,mode_t mode)
函数传入值 filename:要创建的管道
函数传入值 mode:
O_RDONLY:读管道
O_WRONLY:写管道
O_RDWR:读写管道
O_NONBLOCK:非阻塞
函数传入值 mode:
O_CREAT:如果该文件不存在,那么就创建一个新的文件,并用第
三个参数为其设置权限
O_EXCL:如果使用 O_CREAT 时文件存在,那么可返回错误消息。
这一参数可测试文件是否存在
函数返回值 成功:0
出错:1

标准流管道函数说明

与 Linux 的文件操作中有基于文件流的标准 I/O 操作一样,管道的操作也支持基于文件流的模式。这种基
于文件流的管道主要是用来创建一个连接到另一个进程的管道,这里的“另一个进程”也就是一个可以进
行一定操作的可执行文件,例如,用户执行“ls -l”或者自己编写的程序“./pipe”等。由于这一类操作很
常用,因此标准流管道就将一系列的创建过程合并到一个函数 popen()中完成。它所完成的工作有以下几步。
创建一个管道。
fork()一个子进程。
在父子进程中关闭不需要的文件描述符。
执行 exec 函数族调用。
执行函数中所指定的命令。
这个函数的使用可以大大减少代码的编写量,但同时也有一些不利之处,例如,它不如前面管道创建的函
数那样灵活多样,并且用 popen()创建的管道必须使用标准 I/O 函数进行操作,但不能使用前面的 read()、
write()一类不带缓冲的 I/O 函数。
与之相对应,关闭用 popen()创建的流管道必须使用函数 pclose()来关闭该管道流。该函数关闭标准 I/O 流,
并等待命令执行结束。

函数格式

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

msgsnd()函数语法要点

msgsnd()函数原型为:
int msgsnd(int msqid, const void msgp, size_t msgsz, int msgflg)
msqid:消息队列的队列 ID
msgp:指向消息结构的指针。
msgsz:消息正文的字节数(不包括消息类型指针变量)
msgflg:若为IPC_NOWAIT 若消息无法立即发送(比如:当前消息队列已满),函数会立即返回。若为0: msgsnd 调阻塞直到发送成功为止。

msgrcv()函数语法要点

msgrcv()函数原型为:
int msgrcv(int msgid, void *msgp, size_t msgsz, long int msgtyp, int msgflg)
msqid:消息队列的队列 ID
msgp:消息缓冲区, 同于 msgsnd()函数的 msgp
msgsz:消息正文的字节数(不包括消息类型指针变量)
msgtyp:0:接收消息队列中第一个消息;大于 0:接收消息队列中第一个类型为 msgtyp 的消息;小于 0:接收消息队列中第一个类型值不小于 msgtyp 绝对值
且类型值又最小的消息
msgflg:MSG_NOERROR:若返回的消息比 msgsz 字节多,则消息就会截短到 msgsz 字节,且不通知消息发送进程;IPC_NOWAIT 若在消息队列中并没有相应类型的消息可以接收,则函数立即返回;0: msgsnd()调用阻塞直到接收一条相应类型的消息为止。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 10 400小时
第一周 200/200 2/2 20/20 linux命令
第二周 300/500 3/4 16/38 gcc,gdb,makefile
第三周 500/1000 3/7 22/60 交叉编译工具的配置及编译
第五周 900/1300 6/9 68/90 I/O编程的标准,了解一些函数的应用
第六周 1100/1600 8/12 98/110 有名管道,消息列队

参考资料
《嵌入式应用程序设计》学习指导

posted @ 2017-06-12 22:26  宿宝龙  阅读(140)  评论(1编辑  收藏  举报