共享内存是IPC机制中的一种,顾名思义,它允许两个不相关的进程访问同一段内存,这也是一种传递数据的有效方式。
通过man命令可以查看各个函数的详细说明:
Int shmget(key_t key,size_t size,int shmflg);
功能:创建或获取共享内存,并返回其对应的描述符id
返回值:成功,返回创建或获取对应共享内存的描述符,失败返回-1
参数说明:key:共享内存的键值,size:共享内存的大小,shmflg:打开标志,如果一开始没有现成的共享内存,并设置了IPC_CREATE标志,则会新创建一块共享内存
。
void* shmat(int shmid,const void* shmaddr,int shmflg);
功能:把shmid指定的共享内存映射到进程的地址空间里(各个进程的地址不一样)
返回:成功返回映射到进程空间之后的内存地址
参数:shmid:要映射的共享内存的描述符,shmaddr:指定映射到内存之后的地址(可以自己指定一个空闲地址),一般会产生冲突,默认的情况下,这个参数都填为NULLL,让linux系统自动的选择映射的地址
shmflg:打开标志
Int shmdt(const void* shmaddr);
功能;把进程空间的地址与共享内存断开,但是共享内存这片空间还不能被使用
成功返回0,失败返回-1,
shmaddr:要断开共享内存的地址
Int shmctl(int shmid,int cmd,struct shmid_ds* buf);
功能:控制共享内存,把共享内存释放掉,归回给操作系统,其它进程可以,
接着用
成功;根据不同的操作返回不同的值,失败返回-1,
参数:要控制的共享内存的id,
cmd;决定要执行什么样的操作,比如IPC_RMID表示删除共享内存,
buf:获取liunx中描述共享内存的shmid_ds结构,基本不使用,
共享内存通信举例:
//write.c
//命令:gcc -g write.c -o write
//./write
#include
#include
#include
#include
#include
#include
#define TEXT_SZ 2048
struct shared_use_st
{
int write_by_you; //这个标志判断是否数据被读取
char some_text[TEXT_SZ];
};
int main()
{
int shmid;
int running = -1;
struct shared_use_st *shared_stuff;
char buffer[TEXT_SZ];
shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
if(shmid == -1)
{
printf("creat share memory failed!\n");
exit(EXIT_FAILURE);
}
shared_stuff = (struct shared_use_st*)shmat(shmid,NULL,0);
while(running)
{
while(shared_stuff->write_by_you == 1)
{
sleep(1);
printf("wait read process");
}
fgets(buffer,TEXT_SZ,stdin);
strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
shared_stuff->write_by_you = 1;
if(strncmp(buffer,"quit",4) == 0)
{
running = 0;
}
}
shmdt((const void*)shared_stuff);
return 1;
}
//read 先运行
//命令:gcc -g read.c -o read
#include
#include
#include
#include
#include
#include
#define TEXT_SZ 2048
struct shared_use_st
{
int write_by_you;
char some_text[TEXT_SZ];
};
int main()
{
int shmid;
int running = 1;
struct shared_use_st *shared_stuff;
shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
shared_stuff = (struct shared_use_st*)shmat(shmid,NULL,0);
shared_stuff->write_by_you = 0
while(running)
{
if(shared_stuff->write_by_you = 1)
{
printf("write process write %s\n",shared_stuff->some_text);
shared_stuff->write_by_you = 0;
if(strncmp(shared_stuff->some_text,"quit",4) == 0)
{
running = 0;
}
}
}
shmdt((const void*)shared_stuff);
shmctl(shmid,IPC_RMID,0);
return 1;
}