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

学习内容

一.有名管道

1.包括两个.c程序文件均是阻塞式读写管道模式。

读管道(fifo_read.c):创建管道 读管道
写管道(fifo_write.c):由main()函数的参数传入用户需要写入的内容将参数中的内容写入到管道

2.命名管道创建成功后,可以使用open()、read()和write()函数。

对于为读而打开的管道可在open()中设置O_RDONLY

对于为写而打开的管道可在open()中设置O_WRONLY

 

3.打开命名管道和打开其他文件一样,可以用open来打开。

(1).就是程序不能以O_RDWR(读写)模式打开FIFO文件进行读写操作,而其行为也未明确定义,
因为如一个管道以读/写方式打开,进程就会读回自己的输出,同时我们通常使用FIFO只是为了单向的数据传递。

(2).就是传递给open调用的是FIFO的路径名,而不是正常的文件。

(3).第二个参数中的选项O_NONBLOCK,选项O_NONBLOCK表示非阻塞,加上这个选项后,
表示open调用是非阻塞的,如果没有这个选项,则表示open调用是阻塞的。

 

4.命名管道与普通文件的区别:对普通文件的读写时不会出现阻塞问题,在命名管道的读写中却有阻塞的可能。

 

5.命名管道在阻塞与非阻塞打开方式下的读写问题

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

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

6.阻塞问题

对于以只读方式(O_RDONLY)打开的FIFO文件

对于以只写方式(O_WRONLY)打开的FIFO文件

7.程序的运行:

(1)首先启动读管道程序:读管道进程在建立管道之后就开始循环地从管道里读出内容,
如果没有数据可读,则一直阻塞到写管道进程向管道写入数据。

(2)启动写管道程序:读进程能够从管道里读出用户的输入内容。

8.mkfifo()函数:

函数原型:int mkfifo( const char *pathname, mode_t mode );

返回值:成功返回值为0,失败返回值为-1

access函数
函数原型:int access(const char filename, int amode);

函数功能:检查调用进程是否可以对指定的文件执行某种操作。

memset函数
函数原型: void memset(void s, char ch, unsigned n);

函数功能:清空一个结构类型的变量或数组

 

二.消息队列

1.消息队列就是一些消息的列表,用户可以在消息队列中添加消息和读取消息。

消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,比FIFO具有更大的优势。
同时这些消息又存在于内核中,由“队列”ID来标识消息队列的实现包括创建或打开消息队列,
添加消息,读取消息和控制消息队列这四种操作。

2.创建或打开消息队列,msgget(),创建消息队列的数量会受到系统消息队列数量的限制

msgget(创建或打开消息队列)

3.添加消息队列,msgsnd()它把消息添加到已打开的消息队列未尾

msgsnd(发送消息)

4.msgrcv()读取消息队列,它把消息从消息队列中取走

msgrcv(接收消息)

5.msgctl()控制消息队列

msgctl(删除、获取、设置消息队列)

 

posted @ 2017-06-04 13:44  夏薇  阅读(169)  评论(0编辑  收藏  举报