1.4共享队列
1.4.1共享内存
内存映射:避免数据的反复读写拷贝,提高了效率。
内存管理单元MMU:将物理内存与虚拟内存之间架起映射关系
1.创建共享内存 | int shmget(key_t key,size_t size,int shmflg); |
2.建立共享内存和用户空间的映射关系 | void *shmat(int shmid,const void *shmaddr,int shmflg); |
3.写数据 | |
4.读数据 | |
5.解除映射关系 | int shmdt(const void *shmaddr) |
6.删除共享内存 | int shmctl(int shmid,int cmd,struct shmid_ds *buf) |
int shmget(key_t key,size_t size,int shmflg); | ||||
功能:根据key值创建共享内存 | ||||
参数: key:IPC的key值
size:共享内存大小(向上取整到页大小的整数倍)4096 PAGE_SIZE shmflg:对对象内存的操作 IPC_CREAT | 0664 | ||||
返回值: 成功:返回共享内存的ID 失败:-1 |
void *shmat(int shmid,const void *shmaddr,int shmflg); |
功能:建立内存映射 |
参数: shmid:共享内存的ID shmaddr:映射的用户首地址(NULL让操作系统自己去找,返回空间首地址) shmflg:!SHM_RDONLY(可读可写) |
返回值: 成功:映射的用户空间首地址 失败:NULL |
int shmdt(const void *shmaddr) |
功能:解除用户映射关系,释放用户空间 |
参数: shmaddr:映射的用户首地址(NULL让操作系统自己去找,返回空间首地址) |
返回值: 成功:0 失败:-1 |
int shmctl(int shmid,int cmd,struct shmid_ds *buf) |
功能:控制共享内存 |
参数: shmid:共享内存的ID cmd:IPC_RMID:删除 buf:NULL不需要使用 |
返回值: 成功:0 失败:-1 |
指令:ipcs -a查看共享内存 的信息
ipcrm -s 删除信号量集
ipcrm -m 删除共享内存
1.5消息队列
获取一个IPC通信的key值 | key_t ftok(const char *pathname,int proj_id); |
创建消息队列 | int msgget(key_t key,int msgflg); |
发送消息 | int msgsnd(int msqid,void *msgp,size_t msgsz,int msgflg); |
接受消息 | ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg); |
删除消息队列 | int msgctl(int msqid,int cmd,struct msqid_ds *buf); |
key_t ftok(const char *pathname,int proj_id); |
功能:获取ipc的key值 |
参数: pathname:路径 proj_id:项目ID |
返回值: 成功:key 失败:-1 |
int msgget(key_t key,int msgflg); |
功能:根据key值创建一个消息队列 |
参数: key:ipc的key值 msgflg:标志位 IPC_CREAT |0664 |
返回值: 成功:消息队列的id号 失败:-1 |
int msgsnd(int msqid,void *msgp,size_t msgsz,int msgflg); |
功能:向消息队列中发送消息 |
参数: msqid:消息队列的ID msgp:要发送的消息的结构体首地址 struct msgbu{ long mtype; char mtext[msgsz]; }; msgsz:消息体中正文内容大小 msgflg:标志位:默认0
|
返回值: 成功:0 失败:-1 |
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg); |
功能:从消息队列接受消息 |
参数: msqid:消息队列的ID msgp:要存放接收的消息的结构体首地址 struct msgbu{ long mtype; char mtext[msgsz]; }; msgsz:接受消息体中正文内容大小 msgtyp:消息的类型 msgflg:标志位:默认0 |
返回值: 成功:消息队列的id号 失败:-1 |
1.6信号灯
不同主机进程间通信:
1.7网络套接字
文件描述符
客户端:
socket():创建网络套接字
sendto():发送数据包
recvfrom():接受数据包
close():关闭套接字
int socket(int domain,int type,int protocol) |
功能:创建一个通信套接字 |
参数: domain:ip层协议族 AF_INET IP4 AF_INET6 IP6 type:传输层使用的协议类型 SOCK_DGRAM UDP SOCK_STREAM TCP protocol: 0按照默认协议返回值 |
返回值: 成功:返回套接字 失败:-1 |
size_t sendto(int sockfd,const void *buf,sizeof_t len,int flags,const struct sockaddr *dest_addr,socklen_t addrlen); |
功能:向通信套接字发送数据 |
参数: sockfd:套接字 buf:要发送的数据的首地址 len:发送的数据的大小 flags:默认方式 0 dest_addr:保存接受方地址信息的指针 .sin_port = htons(50000)// .sin_addr.s_adde =inet_addr("ip地址")//将地址转为un int inet_ntoa(int 转char) addrlen:接收方地址变量的大小 |
返回值: 成功:实际发送的字节数 失败:-1 |
服务端:
socket()
bind():绑定服务器当前主机的身份(IP+PORT)
recvfrom():接收
sendto():发送
close():关闭
bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen) |
功能:绑定当前主机的ip和进程的端口 |
参数: sockfd:套接字 addr:自己信息的地址 addrlen:地址信息的大小 |
返回值: 成功:0 失败:-1 |
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); |
功能:从套接字接受数据 |
参数: sockfd:套接字 buf:存储接收到的数据的位置的首地址 len:期待接收到的字节数 flags::默认方式:0 addrlen:送发方地址变量的大小 |
返回值: 成功:返回接收到的字节数 失败:-1 |