Unix网络编程 卷2:进程间通信 读书笔记(第二次)
第四章 管道和FIFO
l 管道
由pipe函数创建嵌入式linux 培训,提供单向数据流,返回两个文件描述符fd[0](读)fd[1](写)
管道(无名字)由单个进程创建,多用于父子进程间(有共同祖先)的通信。
半双工通信创建:
父进程创建一个管道后fork派生一个副本。父进程关闭管道的读出端,子进程关闭同一管道的写入端
全双工通信创建:
创建pipe1和pipe2 fork 父进程关闭fd1[0]和fd2[1] 子进程关闭fd1[1]和fd2[0]
全双工管道(SVR4中的pipe)实质由半双工管道构成。fd[0]的数据只能从fd[1]读出,fd[1]的数据只能从fd[0]读出。
标准I/O提供了popen和pclose。
l FIFO(有名管道)
每个FIFO(半双工数据流)有一个路径名与之关联,无亲缘关系的管道之间可以访问同一个FIFO,由mkfifo函数创建。
要打开一个已经存在或创建一个新的FIFO,应先调用mkfifo,再检查他是否返回EEXIST错误,若返回该错误则改为调用open。
l 字节流转消息
1、带内特殊终止序列:换行符
2、显式长度:每个记录前冠以它的长度
3、每次连接一个记录:应用通过关闭与其对端的连接来指示一个记录的结束。
l 客户-服务器程序
一个服务器一个客户
一个服务器多个客户:迭代:每次处理一个客户请求linux开源软件,易遭受拒绝服务型攻击(设置阻塞时钟解决)
并发:让另一个进程或线程处理每个客户请求
第五章 Posix消息队列(推荐使用)
消息具有小整数优先级,不能从队列中读出指定优先级消息的能力
在某个进程往一个队列写入消息之前无需 另外某进程上等待该消息到达
mq_open 创建新队列或打开一个已存在的队列,O_CREAT标识为创建
mq_close 关闭队列,调用进程不再使用该描述符(仍然存在于内存中)unix网络编程 进程间通信,描述符引用计数减一
mq_unlink 删除队列名(彻底删除)
mq_send 往队列中放置消息
mq_receive 从队列中读取消息,返回最高优先级最早消息
mq_getattr 查询队列属性
mq_setattr 设置队列属性
参数表示:
mq_flags 0或O_NONBLOCK
mq_maxmsg 消息个数最大值
mq_msgsize 每个消息的最大值
mq_curmsgs当前队列消息
mq_notify 注册一个信号或线程,有一个消息被放置于某空队列上时发送信号或激活线程
使用内存映射I/O、Posix互斥锁、Posix条件变量实现队列大多数特性
消息创建时潜在竞争:
原因:内存映射文件代表一个消息队列需要两个步骤:先用open创建该文件,再初始化该文件内容。当有两个线程几乎同时调用mq_openunix网络编程 进程间通信,一个线程创建了该文件,然后在该线程完成初始化之前切换到第二个线程,线程二会检测到该文件已存在,立即尝试使用该消息队列。
解决:使用O_EXCL标志检测是否由本线程创建了该文件。
第六章 System V 消息队列
访问SystemV消息队列只需知道该消息队列的标识符
msgget 创建新的消息队列或者打开一个已存在的消息队列,返回整数标识符
msgsnd 往消息队列上放置消息,IPC_NOWAIT非阻塞
msgsrv 从消息队列中读消息,若采用阻塞模式,调用者会被阻塞到下列某个事件发生
(1)所请求的类型可获取
(2)由msqid标识的消息队列从系统中删除,返回EIDRM错误
(3)调用线程被某个捕获的信号所中断,返回ENOMSG错误
msgctl 提供消息队列上的各种操作
IPC_RMID删除指定消息队列
IPC_SET设置消息队列
IPC_STAT返回设置
每个消息相关联的类型字段提供了两个特性:
(1)类型字段可用于标识消息,允许多个进程在单个队列上复用消息
(2)类型字段可用于优先级字段
在消息队列上使用select和poll(SystemV消息队列不是由描述符表识,不能直接用select和poll):
方法一:让服务器创建一个管道,然后派生一个字进程,由子进程阻塞在msgrcv调用中。当某消息准备好被处理时,msgrcv返回,自进程从指定的队列中读出该消息,并把消息写入管道。服务器父进程可能在该管道以及一些网络连接上select。该办***让消息被处理三次。
方法二:父进程创建它自身和子进程之间的共享内存区,然后把管道用作父子进程间的一种标志
窥探消息:让子进程指定msgsrv的窥探标志
#笔记##读书笔记#