2014025688(30) 《嵌入式程序设计》第七周学习总结
有名管道
FIFO也称为有名管道,它是一种文件类型。FIFO简单理解,就是它能把两个不相关的进程联系起来,FIFO就像一个公共通道,解决了不同进程之间的“代沟”。普通的无名管道只能让相关的进程进行沟通(比如父shell和子shell之间)。FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。FIFO往往都是多个写进程,一个读进程。
读进程:
若管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。
若该管道是非阻塞打开的,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数讲立即返回0;
写进程:
若该管道是阻塞打开,则写操作讲一直阻塞到数据可以被写入;
若改管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或调用失败。
消息对列:消息对列的实现包括创建或打开对列、添加信息、读取信息、控制信息4种操作。
msgget():创建或打开对列,创建的消息对列数量会收到系统消息对列的限制;
msgsnd():添加函数,把消息添加到已打开消息对列末尾;
msgrcv():读取函数,把消息从消息对列种取走,可以指定取走某一种消息;
msgctl():控制函数,可以完成多项功能;
mkfifo函数
mkfifo()函数原型是:
int mkfifo(const char * filename,mode_t mode)
filename指的是要创建的管道。
mode是规定读写权限的。
FIFO相关的出错信息
access函数
access()函数原型为:
int access(const char filename, int amode);
filename表示需要测试的文件
amode表示操作模式
sscanf函数
sscanf()函数的原型是:
sscanf(argv[1], "%s", buff);
sscanf函数是以固定字符串为输入源输入的
memset函数
memset()函数原型为:
extern void memset(void buffer, int c, int count)
buffer:为指针或是数组,
c:是赋给buffer的值,
count:是buffer的长度.
Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
msgget函数
msgget()函数原型为:
int msgget ( key_t key, int msgflg )
key是消息队列对象的关键字(key),函数将它与已有的消息队列对象的关键字进行比较来判断消息队列对象是否已经创建
msgflg是权限标志位。
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()调用阻塞直到接收一条相应类型的消息为止。
教材学习中的问题和解决过程
没有仔细阅读代码发现需要两个标签运行程序
课后作业中的问题和解决过程
消息队列要先发送消息才能接收