Unix网络编程 卷2:进程间通信 读书笔记(第二次)

Unix网络编程 卷2:进程间通信 读书笔记(第二次)

第四章 管道和FIFO

l  管道

pipe函数创建,提供单向数据流,返回两个文件描述符fd[0](读)fd[1](写)

管道(无名字)由单个进程创建,多用于父子进程间(有共同祖先)的通信。

半双工通信创建:

父进程创建一个管道后fork派生一个副本。父进程关闭管道的读出端,子进程关闭同一管道的写入端

全双工通信创建:

  1. 创建pipe1pipe2
  2. fork
  3. 父进程关闭fd1[0]fd2[1]
  4. 子进程关闭fd1[1]fd2[0]

全双工管道(SVR4中的pipe)实质由半双工管道构成。fd[0]的数据只能从fd[1]读出,fd[1]的数据只能从fd[0]读出。

标准I/O提供了popenpclose



l  FIFO(有名管道)

每个FIFO(半双工数据流)有一个路径名与之关联,无亲缘关系的管道之间可以访问同一个FIFO,由mkfifo函数创建。

要打开一个已经存在或创建一个新的FIFO,应先调用mkfifo,再检查他是否返回EEXIST错误,若返回该错误则改为调用open


l  字节流转消息

1、带内特殊终止序列:换行符

2、显式长度:每个记录前冠以它的长度

3、每次连接一个记录:应用通过关闭与其对端的连接来指示一个记录的结束。


l  客户-服务器程序

一个服务器一个客户

一个服务器多个客户:迭代:每次处理一个客户请求,易遭受拒绝服务型攻击(设置阻塞时钟解决)

并发:让另一个进程或线程处理每个客户请求


第五章 Posix消息队列(推荐使用)

消息具有小整数优先级,不能从队列中读出指定优先级消息的能力

在某个进程往一个队列写入消息之前无需 另外某进程上等待该消息到达

mq_open 创建新队列或打开一个已存在的队列,O_CREAT标识为创建

mq_close 关闭队列,调用进程不再使用该描述符(仍然存在于内存中),描述符引用计数减一

mq_unlink 删除队列名(彻底删除)

mq_send 往队列中放置消息

mq_receive 从队列中读取消息,返回最高优先级最早消息

mq_getattr 查询队列属性

mq_setattr 设置队列属性

    参数表示:

    mq_flags 0或O_NONBLOCK

    mq_maxmsg 消息个数最大值

    mq_msgsize 每个消息的最大值

    mq_curmsgs当前队列消息

mq_notify 注册一个信号或线程,有一个消息被放置于某空队列上时发送信号或激活线程


使用内存映射I/OPosix互斥锁、Posix条件变量实现队列大多数特性


消息创建时潜在竞争:

原因:内存映射文件代表一个消息队列需要两个步骤:先用open创建该文件,再初始化该文件内容。当有两个线程几乎同时调用mq_open,一个线程创建了该文件,然后在该线程完成初始化之前切换到第二个线程,线程二会检测到该文件已存在,立即尝试使用该消息队列。

解决:使用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)类型字段可用于优先级字段


在消息队列上使用selectpollSystemV消息队列不是由描述符表识,不能直接用selectpoll):

方法一:让服务器创建一个管道,然后派生一个字进程,由子进程阻塞在msgrcv调用中。当某消息准备好被处理时,msgrcv返回,自进程从指定的队列中读出该消息,并把消息写入管道。服务器父进程可能在该管道以及一些网络连接上select。该办***让消息被处理三次。

方法二:父进程创建它自身和子进程之间的共享内存区,然后把管道用作父子进程间的一种标志


窥探消息:让子进程指定msgsrv的窥探标志


#笔记##读书笔记#
全部评论

相关推荐

11-06 16:50
门头沟学院 Java
用微笑面对困难:word打字比赛二等奖的我,也要来凑合凑合
点赞 评论 收藏
分享
Jcwemz:都快过年了,就没几家真正招的,100个投递两个面试算是正常的了 加上你的简历,其实你不能很好的描述你自己是做什么的 两个月的时间,你就负责到自动化的内容啦?
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务