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 | 有名管道,消息列队 |
参考资料
《嵌入式应用程序设计》学习指导