一、进程间通信
管道、信号:只能用于两个进程间进行通讯
共享内存、消息队列、信号量、套接字
二、IPC通信
1.相关知识
1)IPC可用于多个进程间进行通讯,包括共享内存、消息队列、信号量。
2)指令;
ipcs -m:查看共享内存
ipcs -q:查看消息队列
ipcs -s:查看信号量
3)键值:用于标识共享内存、消息队列以及信号量集,确保唯一性。
ftok():键值的创造
头文件:
#include <sys/types.h>
#include <sys/ipc.h>
原型:key_t ftok(const char *pathname, int proj_id);
参数:
const char *pathname:参考位置 (绝对路径)
int proj_id:参考的id (0-255)
返回值: 成功,返回键值(key_t) 失败,返回 -1
2.共享内存
1)什么是共享内存?
在操作系统内核开辟一个空间,每一个进程都可以将这个空间映射到自己的进程空间里面,多个进程可以共享这块内存,
对他的操作都可以立即实现。
范围:整个计算机的进程,都可以对它进行操作。
2)过程
创建共享内存
进程映射到内存进行读写
进程接触映射
删除共享内存
3)相关函数
shmget():打开或者创建一块共享内存
头文件:
#include <sys/shm.h>
#include <sys/ipc.h>
原型:int shmget(key_t key, size_t size, int shmflg);
参数:
key_t key:键值
size_t size:共享内存的大小,以字节为单位
int shmflg:有则打开,没有则创建
IPC_CREAT | 0777
返回值: 成功,返回的是共享内存的id号 失败,返回 -1
shmat():把一个共享内存映射到进程空间
头文件:
#include <sys/shm.h>
#include <sys/types.h>
原型:void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
int shmid, :共享内存的id
const void *shmaddr, :你要将共享内存映射的位置一般填写0,表示由系统分配一块,可用的地址空间
int shmflg:一般填写0 表示共享内存可读写
返回值: 系统给分配的空间的首地址 失败返回-1
shmdt():解除共享内存的映射
头文件:
#include <sys/shm.h>
#include <sys/types.h>
原型:int shmdt(const void *shmaddr);
参数:系统给分配的空间的首地址
返回值:成功 0 失败 -1
shmctl():删除共享内存
头文件:
#include <sys/ipc.h>
#include <sys/shm.h>
原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
int shmid,:贡献内存的id
int cmd, :IPC_RMID
struct shmid_ds *buf:NULL
返回值:成功 0 失败 -1
下边是一个练习代码:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
key_t ft;
int shmid;
ft = ftok("/home/whs/002/7.4",5);
if(ft < 0)
{
perror("ftok");
return -1;
}
printf("ft=%d\n",ft);
shmid = shmget(ft,256,IPC_CREAT|0666); //创建共享内存
if(shmid < 0)
{
perror("shmget");
return -1;
}
void *p = shmat(shmid,0,0); //映射到进程空间,0,由系统分配;0,可读写
strcpy(p,"zhongguowansui!");//写内容到共享内存
shmdt(p); //解除映射
return 0;
}