一、共享内存 1、获取一个键值 ftok(3) 2、使用键值获取共享内存的id shmget(2) #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); 功能:分配一块共享内存段。获取和key值相关的共享内存段的id。 参数: key:ftok(3)的返回值 size:指定了共享内存段的尺寸 shmflg: IPC_CREAT:如果没有和key值相关的内存段,创建 IPC_EXCL: mode: 指定共享内存段的权限 返回值: 成功返回共享内存段的id 失败 -1 errno被设置 编写代码创建一块共享内存段,获取该内存段的id 代码参见 shmget.c 3、将共享内存关联到进程的虚拟地址空间 shmat(2) #include <sys/types.h> #include <sys/shm.h> void *shmat(int shmid, const void *shmaddr, int shmflg); 功能:将一块共享内存段添加到进程的地址空间 参数: shmid:指定了共享内存段的id shmaddr:NULL 有系统选择地址 shmflg: SHM_RDONLY:共享内存段 只读 0 返回值: 返回共享内存段附加到进程的地址 错误 (void *) -1 errno被设置 4、向内存读写数据 5、解除进程的虚拟地址到共享内存的关联 shmdt(2) int shmdt(const void *shmaddr); 功能:解除共享内存段和进程地址空间的关联 参数: shmaddr:指定了共享内存段的起始地址 返回值: 成功 0 -1 错误 errno被设置 举例说明 使用共享内存段实现进程间的通讯 代码参见 shmA.c shmB.c 二、网络的基础知识 协议就是规则。 物理层协议 定义了电气规则 网帧 定义了网络传输的基本单位 链路层协议 (以太网、令牌环网) 在一个局域网里只允许出现一种网帧。 网络通讯中采用TCP/IP协议家族 TCP/IP 协议分为4层或者5层 物理层、链路层 网络层、传输层、应用层 链路层 网络层、传输层、应用层 ip 地址 192.168.1.12 逻辑地址 4G 40亿 MAC地址 网卡的物理地址 6个字节 4G *64K 每块网卡都有自己的一个身份证。 如和查看本地的ip地址和mac地址 sudo ifconfig windows 下 ipconfig /all 要实现通许,需要知道对方的ip地址和端口号 网络设备 集线器 hub 就是对电气的放大和分流 物理层 1层交换 交换机 交换的是网帧 链路层 2层交换 路由器 交换的是ip报文 网络层 3层交换 ip地址的分类 既然要做网络通讯,就必须知道ip地址的构成 ip地址是由网络号和主机号组成 那么我们就需要知道ip地址的主机号 网络号 如何获取一个ip地址的网络号? 需要使用子网掩码 192.168.1.130/25 192.168.1.130 255.255.255.128 192.168.1.128 网络号 127-2 125 192.168.1.125/25 192.168.1.125 255.255.255.128 192.168.1.0 192.168.1.125/24 192.168.1.130/24 局域网内数据的传送过程 如何查看本机的路由表? sudo route -v 如何查看arp表? sudo arp -a 如何知道两台机器是否互通? ping 目标ip地址 172.30.3.93 总结: 一、system v IPC 共享内存 二、网络基础 子网掩码 三次握手 TCP/IP协议分层