您的位置:首页 > 运维架构 > Linux

linux下通过共享内存在进程之间实现通信(system V)

2014-10-06 22:37 786 查看
参照书上的例程,实现在父子进程之间通过共享内存实现简单的通信。

 

#include<stdio.h>

#include<sys/ipc.h>

#include<sys/shm.h>

#include<sys/sem.h>

#include<string.h>

typedef int sem_t;

union semun

{

 int val;

 struct semid_ds *buf;

 unsigned short *array;

}arg;

sem_t CreateSem(key_t key,int value)

{

 union semun sem;

 sem_t semid;

 sem.val = value;

 

 semid = semget(key,1,IPC_CREAT|0666);

 if(-1 == semid)

 {

  perror("create semaphore error\n");

  return -1;

 } 

 semctl(semid,0,SETVAL,sem);

 return semid;

}

int Sem_P(sem_t semid)

{

 struct sembuf sops = { 0,+1,IPC_NOWAIT};

 return (semop(semid,&sops,1));

}

int Sem_V(sem_t semid)

{

 struct sembuf sops = { 0,-1,IPC_NOWAIT};

 return (semop(semid,&sops,1));

}

void DestorySem(sem_t semid)

{

 union semun sem;

 sem.val = 0;

 

 semctl(semid,0,IPC_RMID,sem);

}

 

static char msg[] = "hi,shared memeory\n";

int main()

{

 key_t key;

 int semid,shmid;

 char i,*shms,*shmc;

 struct semid_ds buf;

 int value = 0;

 char buff[80];

 pid_t p;

 key = ftok("/ipc/sem",'a');   /*生成键值*/

 shmid = shmget(key,1024,IPC_CREAT|0604);/*获得共享内存,大小为1024k*/

 semid = CreateSem(key,0);/*创建信号量*/

 

 p = fork(); /*创建子进程*/

 if(p > 0)   /*(父进程*/

 {

   shms = (char*)shmat(shmid,0,0);/*挂接共享内存,shms得到实际可用的地址*/

   memcpy(shms,msg,strlen(msg)+1);/*复制内容*/

   sleep(10);/*等待时间,子进程将数据读出*/

 

   Sem_P(semid);/*信号量semid的value加1*/

   shmdt(shms);/*摘除共享内存*/

   

   DestorySem(semid);/*销毁信号量*/

   

 }

 else if(p == 0)/*子进程*/

 {

  shmc = (char*)shmat(shmid,0,0);/*挂接共享内存*/

  Sem_V(semid);/*信号量semid的value减1*,与Sem_P()配合使用*/

  printf("shared memory value is :%s",shmc);/*读出数据*/

  shmdt(shmc);/*摘除共享内存*/

 }

 return 0;

 

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux c 通信 ipc