共享内存
是系统5提供的一个IPC通信方式,是系统5提供的三种通信方式中,效率最高的
在系统中申请一片内存区,这块内存区主要是用于信息直接传递
这块内存区就叫共享内存 共享内存不会自主阻塞
共享内存实现步骤
1>创建或获取共享内存
2>将共享内存映射到进程中
3>接触映射
4>删除共享内存
1>创建或获取共享内存
shmget 头文件:#include <sys/ipc.h> <sys/shm.h>
int shmget(key_t key,size_t size,int shmflg);功能:创建或获取共享内存
参数:key:密钥 ---->IPC对象的重要区分依据
获取key:1>自动获取:IPC_PRIVAT 0
系统自动分配 >不断生成共享内存
2>手动获取
ftok 头文件:<sys/types.h> <sys/ipc.h>
key_t ftok(const char *pathname,int proj_id);功能:创建key
参数:pathname:工程文件名 proj_id:工程ID
PS:只要参数不变,永远可以找到同一个key
key1=ftok("pause.c",1);
key2=ftok("pause.c",1);
key1=key2
返回值:成功返回key 失败返回-1,并设置错误码
size:共享内存的大小
shmflg:IPC_CREAT|0666
返回值:成功返回共享内存ID 失败返回-1,并设置错误码
2>将共享内存映射到进程中
shmat 头文件:#include <sys/types.h> <sys/shm.h>
void *shmat(int shamid,const void *shmaddr,int shmflg);
功能:将共享内存映射到进程中
参数:shmid:shmget的返回值
shmaddr:你想映射到的地方 :NULL ---> 默认函数寻找
shmflg:0 可读可写
返回值:成功返回void * 地址 失败返回(void *)-1,并设置错误码
3>解除映射
shmdt 头文件:#include <sys/types.h> <sys/shm.h>
int shmdt(const void *shmaddr); 功能:解除映射
参数:shmaddr:映射地址
参数:成功返回0 失败返回-1,并设置错误码
4>删除共享内存
shmctl 头文件:#include <sys/ipc.h> <sys/shm.h>
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
功能:对共享内存的操作
参数:shmid:共享内存的ID号
cmd:选项
IPC_RMID:删除共享内存
buf:给选项赋予的值
IPC_RMID:NULL
返回值:IPC_RMID
成功返回0, 失败返回-1,并设置错误码
系统5:信号量
是IPC通信方式的一种,由一个或多个信号灯组成一个信号组/信号量
其中信号量中每一个信号灯都是单独计数的
PS:信号量和我们学习的共享内存不同
共享内存主要侧重于:双进程通信
信号量主要侧重于:进程控制另外一个进程阻塞或释放
1>操作流程:
1>创建或获取信号量
2>对信号灯进行操作:PV操作
3>删除信号量
1>创建或获取信号量
semget 头文件:#include <sys/types.h> <sys/ipc.h> <sys/sem.h>
int semget(key_t key,int nsems,int semflg);功能:创建或获取信号量
参数:key:参考共享内存
names:信号量中信号灯的个数
semflg:IPC_CREAT|0666
返回值:成功返回信号量ID 失败返回-1,并设置错误码
2>对信号灯的操作
semop 头文件:#include <sys/types.h> <sys/ipc.h> <sys/sem.h>
int semop(int semid,struct sembuf *sops,size_t nsops);功能:对信号灯做操作
参数:semid:semget的返回值
sops:结构体指针 -->集合赋值 多灯-->数组赋值
struct sembuf * {
unsigned short sem_num; //信号灯下标
short sem_op; //加减法操作:PV操作:+1 -1 +2 -2
short sem_flg; //模式: 0阻塞 IPC_NOWAIT:不阻塞
}
nsops:第几个操作 不是下标
返回值:成功返回0 失败返回-1,并设置错误码
3>删除信号量
semctl 头文件:#include <sys/types.h> <sys/ipc.h> <sys/sem.h>
int semctl(int semid,int semnum,int cmd, ...);功能:对信号量的操作
参数:semid:信号量的ID号
semnum:信号灯的下标
cmd:功能选择:
IPC_RMID:删除信号量
GETVAL:获取信号灯的value值
SETVAL:设置信号灯的value值
... 功能选择值
IPC_RMID:NULL
GETVAL:NULL
SETVAL:union semun{
int val; /* Value for SETVAL */ 设置值
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
}
返回值:GETVAL:成功返回value值 其他成功返回0
失败返回-1,并设置错误码