• 共享内存消息队列学习笔记


    2012-1-6

    IPC对象:共享内存、消息队列、信号量(信号灯集)

    key  :IPC_PRIVATE和ftok的返回值。。。。。  常用: key = IPC_PRIVATE 只能自己或者具有血缘关系的使用

    1.ftok()函数:

    key_t  ftork(“路径”, id)

    路径使用自己的工作目录,避免了key冲突。 id  任意指定一个字母,即key由路径+id组成。。。。

    2.共享内存

    特点一:效率最高的一种进程间通信。。。。(数据吞吐量大时才能体现出优势)

    共享内存必须依靠同步机制使用

    共享内存的使用步骤:

    创建共享内存   必须判断 EEXIST   IPC_CREAT|0666 ----权限

    shmget(key, size,IPC_CREAT|0666)返回一个shmid号          system(ipcs -m)查看     ipcrm –m 删除

    映射共享内存

    使用完取消共享内存映射

    删除共享内存对象   IPC_RMID(删除对象)(所有进程都不使用这个共享内存时,则最后一个使用它的进程,删除IPC对象)

    同步---通信

    A:从终端读一个数据

    开始

    创建共享内存(成功则往下执行)(IPC_EXCL判断)失败则打开

    映射

    先写入 pid(填充结构体)

    等待信号(pause())

    被唤醒后读终端

    发信号唤醒B

    B:开始

    打开共享内存

    映射

    读对方的id,写自己的id

    发信号----唤醒A

    等待pause()

    打印完---发信号

    在等待

    IPC  消息队列

    struct msgbuf

    {

             long  mtype; 消息类型

             char  mtex [N]; 消息正文

    };

    创建:int msgget(key, 权限) 权限:IPC_CREAT|0666   成功返回消息队列的ID,错误返回-1

    添加:int msgsnd(msgid, &mybuf, sizeof(struct addrbuf)- sizeof(long), 0)

    读取:int msgrcv(msgid, &mybuf,BUFSIZE, mybuff。type,  0)

    删除:int msgctl (msgid, IPC_RMID,  0)

  • 相关阅读:
    第五节13读取配置中的连接字符串 简单
    第五节 8_手机归属地查询案例 简单
    第五节 8登陆练习操作 简单
    第五节 21类型化DataSet 简单
    PHP XML操作类DOMDocument 简单
    第十节 1ASP.Net简介及学习方法 简单
    第五节 8注入漏洞与参数化查询 简单
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误............ 简单
    第五节 17DateStr 简单
    第五节 19可空数据类型 简单
  • 原文地址:https://www.cnblogs.com/zhou2011/p/2315095.html
Copyright © 2020-2023  润新知