共享内存

共享内存:
    共享内存区域是被多个进程共享的一部分物理内存.
    不同的进程可以通过共享内存通信,是进程间共享数据的一种最快的方法.
    一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容
    (比如你把你家的保险箱密码告诉我,那我们就可以通过保险箱共享money,你一放进去money,我就可以 

    立马收到你的money了!!!!) 
   实现:
       ->创建共享内存,使用shmget函数
       ->映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数 
 当一个进程不再需要共享的内存段时,它将会把内存段从其地址空间中脱离,调用shmdt函数
 Example: sharedMemory.c

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

#define BUFSZ 2048

int main()
{
 int shmid;
 char *shmadd;
 
 if((shmid=shmget(IPC_PRIVATE,BUFSZ,0666))<0)
 {
  perror("shmget");
  exit(1);
 }
 else
 {
  printf("created shared-memory: %d\n",shmid);
  system("ipcs -m");
 }
  
 if((shmadd=shmat(shmid,0,0))<(char *)0)
 {
  perror("shmat");
  exit(1);
 }
 else
 {
  printf("attached shared-memory\n");
  system("ipcs -m");
 }
 
 if((shmdt(shmadd))<0)
 {
  perror("shmdt");
  exit(1);
 }
 else
 {
  printf("deleted shared-memory\n");
  system("ipcs -m");
 }
 
 exit(0);
}

消息队列:
 消息队列就是消息的一个链表,它允许一个或多个进程向它写消息,一个或多个进程从中读消息。具有一

    定的FIFO特性,但是可实现消息的随机查询,这些消息存在于内核中,由“队列ID”来标识
 实现: 创建和打开队列、添加消息、读取消息、控制消息四种操作
 msgget:创建和打开队列,消息数量受系统限制
 msgsnd:添加消息,将消息添加到消息队列尾部
 msgrcv:读取消息
 msgctl:控制消息队列
 Example: msg.c

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define BUFSZ 512

struct message
{
   long msg_type;
   char msg_text[BUFSZ];
};

int main()
{
   int qid;
   key_t key;
   int len;
   struct message msg;

 if((key=ftok(".",'a'))==-1)
 {
    perror("ftok");
    exit(1);
 }
 if((qid=msgget(key,IPC_CREAT|0666))==-1)
 {
    perror("msgget");
    exit(1);
 }
 printf("opened queue %d\n",qid);
 puts("Please enter the message to queue:");
 if((fgets(msg.msg_text,BUFSZ,stdin))==NULL)
 {
   puts("no message");
    exit(1);
 }
 msg.msg_type = getpid();
 len = strlen(msg.msg_text);
 if((msgsnd(qid,&msg,len,0))<0)
 {
    perror("message posted");
    exit(1);
 }
 if(msgrcv(qid,&msg,BUFSZ,0,0)<0)
 {
    perror("msgrcv");
    exit(1);
 }
 printf("message is:%s\n",msg.msg_text);
 if((msgctl(qid,IPC_RMID,NULL))<0)
 {
    perror("msgctl");
    exit(1);
 }
 exit(0);
}

原文地址:https://www.cnblogs.com/wblyuyang/p/2250187.html