T9的空间

You will never walk alone!

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  69 随笔 :: 0 文章 :: 28 评论 :: 0 Trackbacks

IPC

首先讲到的是PIPE,这个并不陌生,相互通信的Process必须具有关系,一般是同父亲的
然后讲到了协同进程
基本是说有一个进程专门用来接收输入,然后处理,然后返回结果
这个就可以用PIPE来实现

创建两个PIPE,一个用于输入给协同进程,另外一个用于接收协同进程的输出
fork之后在子进程中将标准输入输出都dup到管道上

而协同进程的写法可以比较common,只用关心标准输入输出。
PIPE在写的时候如果有多个写进程,那么写的数据小于 PIPE_BUF 则不会乱序,否则自己应该就需要做同步了。

然后就是FIFO,这个就是用mkfifo创建一个file,大家都去用。
PIPE和FIFO都是半双工的

XSI IPC ->即之前System V IPC
消息队列 信号量 共享存储器

在无关进程之间共享存储段,一个是使用上面V系统shm;另外一个是使用mmap将同一文件map到他们自己的进程空间。

另外就是网络IPC了
算是复习下吧,之前这块儿看的比较多
int socket(int domain, int type, int protocol)
domain标识address family -> AF_INET, AF_INET6, AF_UNIX(AF_LOCAL), AF_UNSPEC
type标识socket类型 -> SOCK_DGRAM(UDP), SOCK_RAW(IP), SOCK_SEQPACKET, SOCK_STREAM(TCP)

一般protocol都设置为0,一般address family和type就能确认要使用的protocol

SOCK_SEQPACKET和SOCK)STREAM很像,前一个提供面向数据报文的服务,而后面这种则是面对流。
SOCK_SEQPACKET使用场景SCTP,贴一个SCTP的简要介绍。
http://www.cnblogs.com/qlee/archive/2011/07/13/2105717.html

涉及网络就必须要清楚字节序的问题,字节序与字符编码是两件不同的事情,都要想清楚的,但是要提一下UTF-8这是一种专门设计用来做网络传输的字符编码
无需关心字节序的问题,所以传输的上层数据可以用UTF-8,就不用担心local host和remote host的主机字节序不一样而导致乱序了。

但是很多协议头必须做符合TCP/IP协议的字节序规范,TCP/IP是big endian
关于Big endian和Litter endian我比较容易忘记具体的样子,但是他的出发点是低地址,低地址装的是最高有效字节那么就是big endian,否则就是litter endian。

关于socket有几个可能比较模糊的地方
connect时,也就是client端,如果fd没有绑定到某个地址,那么kernel会帮忙将其绑定到默认地址; 所以bind这件事情是Client和Server都需要做的事情,调用listen之前也一样
然后accept的时候,如果你关心对方的地址,那么提供addr(足够)和len,返回的时候就能知道。
另外UDP(SOCK_DGRAM)也可以Call connect,之后就可以直接call send/write,而不必每次都call sendto指定对端地址。

sendto中flag一般给0,如果是紧急数据给MSG_OOB

文件描述符的传输,目的是想让不同的process在不同的文件描述符中共享文件表。
所以做法上系统会这样,传输文件表指针然后放到接收端的第一个可用的文件描述符上。
这个我在linux上没找到实现,因为这个功能还是有蛮多替代方案的。

posted on 2013-06-06 17:22 Torres 阅读(242) 评论(0)  编辑 收藏 引用 所属分类: APUE

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理