2014025652《嵌入式系统程序设计》第七周学习总结
学习体会
————————————————————————————————————————————————————————————————————————————————————
这周我们学习了有名管道和消息队列,并且在课上和实验楼里面都进行了练习,我从里面学到了很多东西。
学习总结
有名管道
————————————————————————————————————————————————————————————————————————————————————
有名管道比无名管道的优点?
无名管道只能用于具有亲缘关系的进程之间,限制了管道的使用,而有名管道突破了这一个限制,它可以使互不相关的两个进程实现彼此的通信。
阻塞和非阻塞打开的读写讨论
(1)对于读进程。
若该管道是阻塞打开,且当前 FIFO 内没有数据,则对读进程而言将一直阻塞到有数据写入。
若该管道是非阻塞打开,则不论 FIFO 内是否有数据,读进程都会立即执行读操作。即如果 FIFO
内没有数据,则读函数将立刻返回 0。
(2)对于写进程。
若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
mkfifo函数
————————————————————————————————————————————————————————————————————————————————————
mkfifo()函数原型是:
int mkfifo(const char * filename,mode_t mode)
filename指的是要创建的管道。
mode是规定读写权限的。
FIFO相关的出错信息
![](http://images2015.cnblogs.com/blog/1150867/201706/1150867-20170603152908477-1893353937.png)
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()调用阻塞直到接收一条相应类型的消息为止。
收获和总结
————————————————————————————————————————————————————————————————————————————————————
通过这周的课上还有实验楼的学习,我知道了许多函数的含义,并且简单的应用了这些函数,但是还有感觉有很多的不足,需要继续学习。