本文主要是介绍进程间的通信3——IPC对象通信->共享内存、网络通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、共享内存
1、原理
直接对实际物理内存进行操作,不用先拷贝到用户空间再到内核空间(物理内存)。
2、特点
(1)共享内存是一块内核预留的空间;
(2)最高效的通信方式。
3、操作
产生key值 ===>申请 ===>读写 ===> 关闭 ===> 卸载。
(1)产生key值
ftok
key_t ftok(const char *pathname(路径名) , int proj_id(工程id))
功能:将pathname和proj_id转换为key值。
返回值:成功:key值; 失败:-1。
(2)通过key获取IPC对象
shmget
int shmget(key_t key(key值) , size_t size(共享内存大小) , int shmflg(内存访问权限))
功能:使用唯一键值key向内核提出共享内存使用申请。
参数:shmflg通常为IPC_CREAT|0666用来申请 ; 若要检测为IPC_EXCL。
返回值:成功:有效id号;失败:-1。
注:ipcs命令用来查看共享内存。
(3)绑定地址空间
shmat
void *shmat(int shmid(共享内存段id) , const void *shmaddir(绑定地址) , int shmflg(具体操作权限))
功能:将共享内存映射到本地内存。
参数:shmaddr为NULL(由系统选择合适地址);
shmflg为SHM_RDONLY(只读)、0(读写)等。
返回值:成功:返回映射的地址(绑定地址);失败:(void *)-1。
pause
int pause(void)
等待一个信号。
(4)解除绑定(映射)
shmdt
int shmdt(const void *shmddr)
(5)销毁IPC对象
shmctl
int shmctl(int shmid , int cmd(删除对象宏) , struct shmid_ds *buf(删除对象))
功能:修改共享内存属性,可删除指定共享内存对象。
参数:cmd为IPC_RMID;
buf为NULL。
例如:左边发送,右边接收。接收方需要等待一个信号通过pause来控制打印不会刷屏。实现发一个收一个的效果。
注意:(1)共享内存数据的存储方式是拷贝,而非剪切。
(2)共享内存的数据多次不同进程读写同一操作对象,数据没有偏移情况下会覆盖。
二、网络通信
1、前景介绍
网络通信需要在物理层面、软件(逻辑)层面都有通路。
局域网、城域网、广域网;因特网。
最初APAR Net //阿帕网便是将众多局域网连接,形成因特网雏形。
之后为解决不同体系结构网络互联问题,1981年国际标准化组织ISO制定了开放系统互连模型(OSI网络模型)。
2、OSI参考模型
(1)物理层:规定了物理层面的电气特性,及相关机械特性。
完成物理层面数据的传输 —— 一位一位二进制数据。 //比特流
(2)数据链路层:规定了传输数据的格式。
控制传输过程可靠 。 //帧数据
(3)网络层:用于解决网络与网络之间数据传输。 //数据包
(4)传输层:传输控制层,控制传输过程,保证数据完整性。 (TCP/UDP)
(5)会话层:处理一次会话过程。
(6)表示层:规定了传输数据的格式和方式。 //加密
(7)应用层:直接获取要收发的数据。
每个层次中,都有自己的一套规范——协议。
3、操作系统角度
应用层在用户层,其余都在内核层<网络协议栈>。用户层与内核层用socket接口来连接。
IP地址——用来标识网络中的一台主机(凡能网络通信的机器)。
端口号——用来标识主机中某一个具体(进行网络通信)进程。
IP + 端口号——进程在网络的地址。
(1)IP
本质:32位(4进制)整型数值。<表示:点分十进制>
一进制的范围:0~255。
组成:网络号(表示所处的网络) + 主机号(表示能容纳的主机)
分类:A类(0.x.x.x~127.x.x.x),B类(128.x.x.x~192.x.x.x),C类(192.x.x.x~223.x.x.x),D类(组播地址),E类(保留)
注:(1)主机号为0的IP地址是网络地址,主机号为255的地址是广播地址。
(2)子网掩码(255.255.255.0):与IP地址相与,结果判断是否在同一网络下。
(2)端口号
本质:16位数值(2字节)
分类:①众所周知端口:1~1023(1~255间为众所周知端口;256~1023端口通常由UNIX系统占用)
知名端口号(已经分配给标准应用服务软件)。
eg:http协议用到端口号80.
②已登记端口:1024~49151
注册端口号(非标准应用服务软件可申请)。
③动态或私有端口:49152~65535
动态分配的端口号(系统动态分配给应用程序使用)。
// 50000以上端口号
4、编程
TCP/UDP:TCP协议<高可靠>特点——①面向连接 ②可靠传输(tcp协议机制里面的功能)。 //打电话
UDP协议<高效率>特点:①不可靠传输 ②无连接 ③数据报。 //广播
编程模型:①c/s(client server)——客户端-服务器模型;
②b/s(browser server) ——浏览器-服务器模型。
(1)基于UDP c/s通信模型
-------client——客户端——主动角色-------
socket
int socket(int domain(通信范围) , int type , int protocol)
功能:程序向内核提出创建一个基于内存的套接字描述符。
参数:domain:协议簇;当为AF_INET表示基于IPV4协议。
type:SOCK_STREAM——流式套接字(通常指TCP);SOCK_DGRAM——数据报套接字(通常指UDP)。
protocol:0默认。
一种特殊的文件<专门用于网络通信>
socket接口函数,提供了一个可访问操作系统网络功能的接口。
sendto
ssize_t sendto(int sockfd(用于通信的socket对应的fd) , const void *buf(发送数据所在空间) , size_t len(发送字节数) , int flags(0默认) , const struct sockaddr *dest_addr(目的地址) , socklen_t addrlen(目的地址长度))
发数据。
返回值:成功:发送出去的字节数;失败:-1。
这篇关于进程间的通信3——IPC对象通信->共享内存、网络通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!