共享内存

//共享内存
//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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值