一、基于文件的通信
1.普通文件(io/mmap)
2.有名管道文件
3.匿名管道文件
4.Socket
二、基于内存的通信
0.一组内核内存的工具
ipcs
ipcs-m
ipcs-q
ipcs-s
ipcrm
ipcrm-q 编号ID
1.普通的父子进程之间的匿名内存共享映射
2.内核共享内存
编程模型
2.1创建共享内存,得到一个ID shmget
2.2把ID映射称虚拟地址(挂载) shmat
2.3使用虚拟地址访问内核共享内存使用任何内存函数与运算符
str***mem*** += ++ [] ->
2.4卸载虚拟地址 shmdt
2.5删除共享内存 shctl(修改/获取共享内存的属性)
共享内存的属性
案例:
A创建共享内存,并且修改内存数据
1.创建共享内存
intshmget(ke7_t key, //key_t 是unsig int,为什么需要key
intsize, //共享内存大小
intflags) 共享内存的属性与权限
为什么需要 key_t:
约定创建与访问的是同一共享内存
第三个参数:
方式|权限
方式:
创建 IPC_CREATIPC_EXCL(打开且保存以前数据)
打开 0
常见的两种方式
创建:IPC_CREAT|IPC_EXCL| 0666
返回值:
成功返回共享内存ID
失败返回-1
B根据ID得到共享内存,并且访问内存的数据。
voidshmat(int id,
void*startaddr, //0:系统指定首地址
intflags) //挂载方式,建议为0,可以为IPC_RONLY
C.删除
intshmctl(int id, int how, struct shmid_ds)
how:
IPC_STAT
IPC_SET
IPC_RMID
3.内核共享队列(有序)
编程模型:
3.1创建共享队列/得到消息队列 msgget
3.2使用队列(发送消息msgsnd/接收消息msgrcv)
3.3删除队列 msgctl
案例:
A:创建一个共享队列
intmsgget(key_t, int);
B:发送消息
intmsgsnd(int id, //消息队列ID
constvoid *msg, //要发送消息
size_tlen, //消息的长度
intflags //发送消息的方式,建议为0
);
返回值:
-1:失败
0:成功
第二个参数的消息有固定的格式
4字节:表示消息的类型
若干字节:消息的内容。
第三个参数:
消息的大小,不包含类型的4个字节
三、基于socket文件的IPC
socket文件的通信方式,比较重要,网络采用这种模型
两种模型:
对等模型
C/S主客模型
1.对等模型:
1.建立socketsocket
intsocket(int domain, //地址族的类型 AF_UNIX FA_INET
inttype, //支持的数据格式:流 SOCK_STREAM/ 报文 SOCK_DGRAM
intprotocol); //支持的协议,建议为0. 0:默认协议
返回值:
成功返回文件描述符。
失败返回-1
2.绑定在地址上面(文件目录地址)URL(Universe Resource Location)
协议://路径/文件名
file:///usr/bin/ls
htpp://192.168.0.1/index.php
socketsockaddr;
socketsocketaddr_un; //un=unix
socketsocketaddr_in; //in=internet
bind()
intbind(int fd, //socket描述符
structsocketaddr *addr, //绑定地址
socklen_tsize); //地址长度
3.接收数据
read/send/sendto
4.关闭socket
1.建立socketsocket
2.连接到目标connect(可选)
3.发送数据write/send/sendto (write/send 必须连接) sendto(可以不连接)
4.关闭 close
四、基于内存通信的应用:进程同步
信号量