Linux之共享内存shm

shm.h 

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/shm.h>

union semun
{
    int     val;
    struct semid_ds *buf;
    unsigned short *array;
    struct seminfo *__buf;
};

key_t Ftok(const char *pathname, int proj_id)
{
    key_t key = ftok(pathname, proj_id);
    if(key == -1)
    {
       perror("ftok Error!\n.");
       exit(1);
    }
    return key;
}

int Semget(key_t key, int nsems, int semflg)
{
    int id = semget(key, nsems, semflg);
    if(id == -1)
    {
      perror("semget Error!\n");
      exit(1);
    }
    return id;
}

int Shmget(key_t key, size_t size, int shmflg)
{
    int shm_id = shmget(key, size, shmflg);
    if(shm_id == -1)
    {
      perror("shmget Error!\n");
      exit(1);
    }
    return shm_id;
}

void *Shmat(int shmid, const void *shmaddr, int shmflg)
{
   void *addr = shmat(shmid, shmaddr, shmflg);
   if(addr == (void *)-1)
   {
     perror("shmat Error!\n");
     exit(1);
   }
   return addr;
}

shm.c

#include"shm.h"

int main()
{
   key_t shm_key = Ftok("myshm", 0xff);
   printf("shm_key: %x\n",shm_key);

   int shm_id = Shmget(shm_key, 1024, IPC_CREAT|IPC_EXCL|0755 );
   char *addr = (char *)Shmat(shm_id, NULL, 0);
   
   int sem_id = Semget(shm_key, 2, IPC_CREAT|IPC_EXCL|0755);
   union semun init;
   init.val = 0;
   semctl(sem_id, 0, SETVAL, init);
   semctl(sem_id, 1, SETVAL, init);

   struct sembuf v = {0, 1, 0};
   struct sembuf p = {1, -1, 0};

   while(1)
   {
     printf("Ser: >");
     scanf("%s", addr);
     semop(sem_id, &v, 1);

     semop(sem_id, &p, 1);
     printf("Cli: >%s\n", addr);
   }
   shmdt(addr);

   semctl(sem_id, 0, IPC_RMID);
   semctl(sem_id, 1, IPC_RMID);

   int ret = shmctl(shm_id, IPC_RMID, NULL);
   if(ret == -1)
    printf("Remove shm Error!\n");
   else
    printf("Remove shm Success!\n");
    
   return 0;
}

cli.c

#include"shm.h"

int main()
{
   key_t shm_key = Ftok("myshm", 0xff);

   int shm_id = Shmget(shm_key, 0, 0);
   char *addr = (char *)Shmat(shm_id, NULL, 0);
   
   int sem_id = Semget(shm_key, 0, 0);

   struct sembuf v = {1, 1, 0};
   struct sembuf p = {0, -1, 0};

   while(1)
   {
     semop(sem_id, &p, 1);
     printf("Ser: >%s\n", addr);

     printf("Cli: >");
     scanf("%s", addr);
     semop(sem_id, &v, 1);
   }
   shmdt(addr);
    
   return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值