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反地址解析协议:

 

 

 

0 0