zoukankan      html  css  js  c++  java
  • 共享内存

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

  • 相关阅读:
    最近学习的 Node.js 之 http
    最近学习的 Node.js 基础:安装、环境配置、forever
    关于MySQL5.7 几天的总结(简单分区 & json类型)
    不会点git真不行啊.
    python爬虫基础_scrapy
    python爬虫基础_webwechat
    python爬虫基础_requests和bs4
    python之django母板页面
    python之django基础
    python网络之web框架
  • 原文地址:https://www.cnblogs.com/wblyuyang/p/2250187.html
Copyright © 2011-2022 走看看