2014025653《嵌入式系统程序设计》第七周学习总结
2014025653《嵌入式系统程序设计》第七周学习总结
这周我学习了有名管道和消息队列,知道了许多函数,并且进行了应用练习。
学习总结
有名管道
有名管道相比无名管道好处:
无名管道只能用于具有亲缘关系的进程之间,这就大大地限制了管道的使用。有名管道的出现突破了这种限制, 它可以使互不相关的两个进程实现彼此通信。FIFO 是严格地遵循先进先出规则的,对管道及 FIFO 的读总是从开始
处返回数据,对它们的写则把数据添加到末尾。
对阻塞打开和非阻塞打开的读写进行讨论。
mkfifo函数
mkfifo()函数的原型为:int mkfifo(const char *filename,mode_t mode)
filename:要创建的管道
mode:用来规定读写权限
FIFO相关出错信息
sscanf函数
sscanf函数与scanf函数用法相同,只是sscanf函数使用字符串进行输入的。
access函数
access()函数的原型为:int access(const char *filename, int amode);
filename:需要测试的文件
amode:操作模式
memset函数
memset()函数的原型为: void *memset(void *s, char ch, unsigned n);
用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
消息队列
消息队列的含义:消息队列就是一些消息的列表。用户可以从消息队列中添加消息和读取消息等。
消息队列的优点
异步:现在排队吧,以后再运行它。 去耦:将应用程序的逻辑。 韧性:如果它的一部分失败不会记下你的整个应用程序。 冗余:如果他们失败可以重试作业。 担保:可确保作业将被处理。 可扩展性:许多工人可以在队列中处理个别工作。 剖析:可帮助确定性能问题。
消息队列的缺点
异步:你必须等待,直到作业完成。 负载:每个队列中的作业必须等待轮到它,然后才能进行处理。如果一个作业超支,它影响每个后续的工作。 架构:应用程序需要进行设计时考虑到队列中。
msgget函数
msgget()函数的原型为:int msgget(key_t key, int msgflg)
key:消息队列的键值,多个进程可以通过它访问同一个消息队列,其中有个特殊值 IPC_PRIVATE。它用于创建当前进程的私有消息队列
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()调用阻塞直到接收一条相应类型的消息为止。
fgets函数
fgets()函数的原型为:char * fgets(char * string, int size, FILE * stream);
string为一个字符数组,用来保存读取到的字符。
size为要读取的字符的个数。如果该行字符数大于size-1,则读到 size-1 个字符时结束,并在最后补充' \0';如果该行字符数小于等于 size-1,则读取所有字符,并在最后补充 '\0'。即,每次最多读取 size-1 个字符。
stream为文件流指针。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 9篇 | 180小时 | |
第一周 | 200/200 | 1/1 | 20/20 | |
第二周 | 400/600 | 1/2 | 20/40 | |
第三周 | 600/1200 | 1/3 | 20/60 | |
第四周 | 600/1800 | 1/4 | 20/80 | |
第五周 | 600/2400 | 1/5 | 20/100 | |
第六周 | 600/3000 | 1/6 | 20/120 | |
第七周 | 600/3400 | 1/7 | 20/140 | |
第八周 | 800/4200 | 1/8 | 20/160 | |
第九周 | 800/5000 | 1/9 | 20/180 |