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

来源:互联网 发布:算命的为何准 知乎 编辑:程序博客网 时间:2024/06/06 19:40

参照书上的例程,实现在父子进程之间通过共享内存实现简单的通信。

 

#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;
 
}

 

0 0
原创粉丝点击