一、共享内存
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协议分层