Day32、IPC进程间通信(共享内存)、网络基础知识
来源:互联网 发布:非线性最优化确定参数 编辑:程序博客网 时间:2024/05/01 12:08
一、 共享内存
两个或者更多进程,共享同一块由系统内核负责维护的内存区域,其地址空间通常被映射到堆和栈之间
ftok (3)参见消息队列
shmget(2)
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
功能:分配一段共享内存空间
参数:
Shmflg:参见消息队列 取0是只获取
key:ftok的返回值
size:要映射的内存的长度,以页的长度为单位
返回值:
共享内存的id
-1 代表失败
Shmat(2)shmdt(2)
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:获取到共享内存映射到进程的虚拟地址
参数:
Shmid :函数shmget的返回值
Shmflg: SHM_RDONLY:共享内存只读 0:读写方式共享内存
Shmaddr:NULL由内核来指定
返回值: (void *) -1 失败
int shmdt(const void *shmaddr);
功能:解除共享内存的映射
参数:shmaddr:shmat函数的返回值
返回值:
举例:使用共享内存进行进程间通讯 write.c Read.c
write.c
1 #include<stdio.h>
2#include<sys/types.h>
3 #include<sys/ipc.h>
4 #include<string.h>
5 #include<sys/shm.h>
6 int main(){
7 key_t key;
8 int shmid;
9 //产生一个键值
10 key=ftok(".",21);
11 if(key==-1){
12 perror("ftok");
13 return 1;
14 }
15 //获取键值对应的共享内存的id
16 shmid=shmget(key,1024,IPC_CREAT|0664);
17 if(shmid==-1){
18 perror("shmget");
19 return 2;
20 }
21 void *p=shmat(shmid,NULL,0);
22 if(p==(void *)-1){
23 perror("shmat");
24 return 3;
25 }
26 //向共享内存的空间里写内容
27 strcpy(p,"this is a test! \n");
28 //解除映射
29 shmdt(p);
30 p=NULL;
31 return 0;
32 }
tarena@tarena-virtual-machine:~$ ./a.out
tarena@tarena-virtual-machine:~$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 0 tarena 700 76800 2 dest
0x15012dff 163845 tarena 664 1024 0
664是创建的内存地址空间
Read.c
1 #include<stdio.h>
2#include<sys/types.h>
3 #include<sys/ipc.h>
4 #include<sys/shm.h>
5 int main(){
6 key_t key;
7 int shmid;
8
9 key=ftok(".",21);
10 if(key==-1){
11 perror("ftok");
12 return 1;
13 }
14 shmid=shmget(key,1024,0);
15 if(shmid==-1){
16 perror("shmget");
17 return 2;
18 }
19 void *p=shmat(shmid,NULL,SHM_RDONLY);
20 if(p==(void *)-1){
21 perror("shmat");
22 return 3;
23 }
24 char *str=(char *)p;
25 printf("%s\n",str);
26 shmdt(p);
27 p=NULL;
28 return 0;
29 }
tarena@tarena-virtual-machine:~$ gcc write.c
tarena@tarena-virtual-machine:~$ ./a.out
this is a test!
补充:
删除消息队列、共享内存
ipcrm(1)
ipcrm –m (shmid)163845
二、网络基础知识
1、 协议(规则)
网络通讯中,使用的是TCP/IP协议簇
TCP/IP协议分为四层
链路层:(链路层和物理层)
物理层规定了一些电器规则
链路层规定了设备驱动程序、以太网帧
网络层:
传输层:
应用层:
端口号:服务器软件必须监听端口号
每一块网卡都有自己的一个身份证,叫做MAC地址(物理地址)
Sudo ifconfig
硬件地址 00:0c:29:b9:98:2b
用到的地址是ip地址: inet 地址:192.168.65.129 是逻辑地址
需要把ip地址和MAC地址做绑定
2、 ip地址的分类
ip地址分为网络号和主机号
如果主机号为全0,代表网段号,全1为这个网段的广播号
ip地址分类
在网络通讯中,首先找到要通讯的主机的ip地址,根据ip地址确定了要通讯的主机。需要根这台机器上的某个进程通讯时,则需要这个进程监听的端口号。
ip地址+端口号 socketpair
ip地址:私有ip地址(局域) 、公有ip地址(公网)
子网掩码:用来区分子网
Ip地址和i子网掩码做与操作,得出来的是子网网段
Ip 140.252.20.68/24
Ip地址是140.252.20.68
子网掩码是255.255.255.0
网络号是:140.252.20.0
同一网段的ip范围:140.252.20.0~255。去掉主机号全0和全1
集线器:(HUB)简单的将物理电信号放大分流作用(物理层交换)
交换机:链路层交换(二层交换)
路由器:IP数据报(三层交换)
ARP地址解析协议:实现物理地址和IP地址的转换
RARP反地址解析协议:
- Day32、IPC进程间通信(共享内存)、网络基础知识
- 进程间通信(IPC):共享内存
- 进程间通信(IPC)---共享内存
- 进程间通信IPC之--共享内存
- Linux 进程间通信 (IPC) //共享内存
- 进程间通信IPC之--共享内存
- 进程间通信IPC之--共享内存
- 进程间通信IPC之--共享内存
- 进程间通信(IPC)之共享内存
- 进程间通信--IPC之共享内存
- 进程间通信IPC---共享内存
- 多进程通信(IPC)--共享内存
- linux 进程间通信(IPC)一共享内存
- linux进程间通信(IPC)--共享内存
- Linux进程IPC浅析[进程间通信SystemV共享内存]
- Linux C编程--进程间通信(IPC)5--System V IPC 机制3--共享内存
- Linux C编程--进程间通信(IPC)5--System V IPC 机制3--共享内存
- Linux下网络编程(3)——进程间通信(IPC),共享内存,传递结构体数据
- Maven之(一)Maven是什么
- 完整版点名器
- 文章标题
- 216_实现width宽度充满占满屏幕的底部菜单dialog
- Ubuntu以太网已断开的解决办法
- Day32、IPC进程间通信(共享内存)、网络基础知识
- 前台页面的国际化处理
- mysql中外键约束级联更新与删除
- c++基础(6-8)
- 在Python中实现你自己的推荐系统【转载】
- SQLserver经典查询语句
- linux 文件及命令(四)
- LeetCode 27. Remove Element
- SpringMVC token 防止表单重复提交,加上注释,帮助理解