linux 进程间通讯-共享内存

头文件

#include <sys/shm.h>

#include <sys/types.h>

#include <sys/ipc.h>

结构体

共享内存管理结构体:

struct shmid_ds {

        struct ipc_perm shm_perm;  

        int shm_segsz;             

        __kernel_time_t shm_atime; 

        __kernel_time_t shm_dtime; 

        __kernel_time_t shm_ctime; 

        __kernel_ipc_pid_t shm_cpid;

        __kernel_ipc_pid_t shm_lpid;

        unsigned short shm_nattch;  

        unsigned short shm_unused;  

        void *shm_unused2;          

        void *shm_unused3;          

    };

API

void *shmat(int shmid, const void *shmaddr, int shmflg);//shared memory attach operation 

连接共享内存

参数:

shmid 共享内存标识符

shmaddr 共享内存地址

shmflg 共享内存标志

返回值:

正确 返回共享内存虚拟地址

错误 返回-1

补充说明:

如果shmaddr是空指针,共享地址由系统分配.

如果shmaddr非空且(shmflg &SHM_RND)0,则共享地址为(shmaddr-((uintptr_t)shmaddr%SHMLBA)).

如果shmaddr非空且(shmflg &SHM_RND)0,则共享地址为shmaddr.

(shmflg &SHM_RDONLY)0时共享内存段只读;

^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_

int shmctl(int shmid, int cmd, struct shmid_ds *buf);//shared memory control operations  

控制共享内存

参数:

shmid 共享内存标识符

cmd 控制命令

buf 共享内存管理结构体

返回值:

正确 返回0

错误 返回-1

补充说明:

IPC_STAT 获取shmid_ds信息

IPC_SET 设置shmid_ds信息

IPC_RMID  删除共享内存

^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_

int shmdt(const void *shmaddr);//shared memory detach operation  

删除共享内存

参数:

shmaddr 共享内存地址

返回值:

正确 返回0

错误 返回-1

补充说明:

^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_

int shmget(key_t key, size_t size, int shmflg);//get shared memory segment

创建/获取共享内存段

参数:

key 键值

size 共享内存大小

shmflg 标识

返回值:

正确 返回共享内存标识符

错误 返回-1

补充说明:

keyIPC_PRIVATE(0)则创建新的共享内存

key不为IPC_PRIVATE(shmflg &IPC_CREAT)0,则创建新的共享内存

size为新建共享内存的大小,若是获取共享内存则设size0

shmflg0获取共享内存标识符

IPC_CREAT:shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符

IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错

 
例子:
写:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>

typedef struct shm{
	int i;
	char j;
}SHM;

int main(int argc,char **argv)
{
	int shmid;
	SHM *shm1;
	shmid=shmget(123,sizeof(SHM),IPC_CREAT|0660);
	if(shmid==-1)
		perror("shmget()");
	printf("shmid%d\n",shmid);
	shm1=(SHM*)shmat(shmid,0,0);
	if(shm1==(SHM*)(-1))
		perror("shmat()\n");
	while(1){
		shm1->i+=1;
		printf("w:%d\n",shm1->i);
		sleep(1);
		if(shm1->i>100)
			break;
	}
	if(shmdt(shm1) == -1){
		return -1;
	}
	if(shmctl(shmid,IPC_RMID,0) == -1){
		return -1;
	}
	return 0;
}

读:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>

typedef struct shm{
	int i;
	char j;
}SHM;

int main(int argc,char **argv)
{
	int shmid;
	SHM *shm1;
	shmid=shmget(123,sizeof(SHM),0);
	if(shmid==-1)
		perror("shmget()");
	printf("shmid:%d\n",shmid);
	shm1=(SHM*)shmat(shmid,0,0);
	if(shm1==(SHM*)(-1))
		perror("shmat()\n");
	while(1){
		printf("r:%d\n",shm1->i);
		sleep(1);
		if(shm1->i>100)
			break;
	}
	if(shmdt(shm1) == -1){
		return -1;
	}
	if(shmctl(shmid,IPC_RMID,0) == -1){
		return -1;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值