//共享内存
//shm.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <fcntl.h>
#include <sys/shm.h>
#define DEF_MAX_PATH ("./SHM")
#define DEF_STD_ERROR (-1)
#define DEF_SHM_SIZE (1024)
int main(int argc,char *argv[])
{
key_t key;
int shm_id;
void *addr;
struct shmid_ds shm_ds;
//create file key
key = ftok(DEF_MAX_PATH,atoi(argv[1]));
if(key == DEF_STD_ERROR)
{
printf("%s\n",strerror(errno));
}
//printf("Sucess\n");
//create / open shared memory
shm_id = shmget(key, DEF_SHM_SIZE,IPC_CREAT);//reaturn id
if(shm_id == DEF_STD_ERROR)
{
printf("%s\n",strerror(errno));
return -1;
}
//map of shared memory
addr = shmat(shm_id, NULL,0);
if(addr == NULL)
{
printf("%s\n",strerror(errno));
//delete shared memory
shmctl(shm_id,IPC_RMID,NULL); //delete
return -1;
}
//write
printf("Please input data:");
scanf("%s",(char*)addr);
//unmap
shmdt(addr);//收回虚拟地址空间,解除映射
//check shared mempry state
printf("key = %d\n",key);
shmctl(shm_id,IPC_STAT,&shm_ds);
printf("size:[%d] , creator:[%d] , key:[%d]\n",shm_ds.shm_segsz,shm_ds.shm_perm.uid,shm_ds.shm_perm.__key);
return 0;
}
//shm_reader.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <fcntl.h>
#include <sys/shm.h>
#define DEF_MAX_PATH ("./SHM")
#define DEF_STD_ERROR (-1)
#define DEF_SHM_SIZE (1024)
int main(int argc,char *argv[])
{
key_t key;
int shm_id;
void *addr;
struct shmid_ds shm_ds;
//create file key
key = ftok(DEF_MAX_PATH,atoi(argv[1]));
if(key == DEF_STD_ERROR)
{
printf("%s\n",strerror(errno));
}
//create / open shared memory
shm_id = shmget(key, DEF_SHM_SIZE,IPC_CREAT);//reaturn id
if(shm_id == DEF_STD_ERROR)
{
printf("%s\n",strerror(errno));
return -1;
}
//map of shared memory
addr = shmat(shm_id, NULL,0);
if(addr == NULL)
{
printf("%s\n",strerror(errno));
//delete shared memory
shmctl(shm_id,IPC_RMID,NULL); //delete
return -1;
}
//print
printf("%s\n",(char*)addr);
//unmap
shmdt(addr);//收回虚拟地址空间,解除映射
//get information
shmctl(shm_id,IPC_STAT,&shm_ds);
printf("size:[%d] , creator:[%d] , key:[%d]\n",shm_ds.shm_segsz,shm_ds.shm_perm.uid,shm_ds.shm_perm.__key);
//delete
shmctl(shm_id,IPC_RMID,NULL);
return 0;
}
共享内存
最新推荐文章于 2023-07-13 14:11:05 发布