IPC - 进程间通信
  文件/信号/管道/共享内存/消息队列/信号量集/网络
  XSI IPC (共享内存、消息队列和信号量集)
  使用方式 非常的类似。

共享内存的使用步骤:
    1 生成一个key(对外的授权),通过key可以进入XSI IPC内部。
        key(本质是一个数字)的生成有三种方式:
      1) IPC_PRIVATE 宏 做key,很少使用,因为私有就没法进行进程间通信。
      2) 定义一个头文件,在头文件中定义所有的key
      3) ftok()生成key,ftok需要提供两个参数,一个是 存在的任意路径,另一个是项目的编号(随便)
    2 创建/获取一个共享内存。
        shmget()可以创建/获取 一个共享内存。
    3 用虚拟内存地址 挂接(映射) 共享内存。
        shmat()挂接
    4 使用
    5 脱接(解除映射) 共享内存。
        shmdt() 脱接,不删除共享内存
    6 如果确定不需要,可以考虑删除。(根据需要)
        shmctl()可以查看、修改、删除。
        shmctl函数的用法:
        shmctl(int shmid,int cmd,struct shmid_ds*)
     cmd的情况:
     IPC_STAT - 查询,会把结果放入结构体
     IPC_SET - 修改,通过结构体修改(只有少数能改,包括权限、用户和组)
     IPC_RMID - 删除,第三个参数不需要

  几个命令:
     ipcs 可以查看XSI IPC结构
        -a 所有  -m 共享内存 -q 消息队列 -s 信号量集
     ipcrm 可以删除XSI IPC结构,需要指明ID
        -m ID   -q ID   -s ID 

XSI IPC(消息队列、共享内存、信号量集)的共性:
   1 创建和获取都需要一个key,用ftok函数
   2 用xxxget() 获取/创建 一个结构,返回ID
   3 在创建时,多半使用0666|IPC_CREAT,IPC_EXCL可选,使用IPC_EXCL时,如果已经存在,会返回-1.
   4 对IPC结构都提供一个xxxctl函数,可以进行:
     IPC_STAT - 查询
     IPC_SET - 修改
     IPC_RMID -删除

  消息队列的使用步骤:(数据封装在消息中)
   1 ftok生成key
   2 使用msgget创建/获取消息队列,返回msgid
   3 发送/接收消息,函数是:msgsnd()/msgrcv()
   4 如果不需要,用msgctl()删除。
     msgsnd()和msgrcv()机制:
     消息可以定义类型,格式如下:
       struct mymsg{ //结构体的名字可以修改
           long mtype; //消息类型
           char buf[];//程序可以随意定义
       };
  在计算消息的大小时,可以去掉mtype占的空间。

  mtype是一个正数,代表消息的类型,在接收时使用
  在接收消息时,可以指定消息的接收类型:
  msgtyp - =0 接收 任意类型的消息中的第一个
              - >0 接收 该类型的消息中的第一个
              - <0 接收 小于等于该类型绝对值的一个
              (从小到大)

  flags - 0 代表如果不满足发送接收,等待(阻塞)
          - IPC_NOWAIT 如果不满足,返回-1(非阻塞)
  注: 查看msg文档时,注意区分msg和msq

信号量集(semphore arrays)

      IPC中,速度最快的是共享内存,最常用的是消息队列。因为共享内存 应对 多进程(超过2个进程)同时写时 会有错误。
      信号量 其实就是一个计数器,用于控制 同时访问数据的进程总数。信号量集 就是由 多个信号量组成的数组。
      IPC用key对应信号量集。
      信号量的工作方式:
       先设一个初始值(并行最大的进程数),然后每运行一个进程就减1,进程完成工作后,计数+1,到 0 就不允许再运行新的进程。
    
   关于信号量集的函数和步骤:
      1 生成key,函数ftok()
      2 创建信号量集,函数 semget()
      3 设置每个信号量的初值,函数 semctl()
      4 使用,需要用semop函数进行 值的改变(+1和-1)
      5 如果不再使用,可以 删除。

  网络
   IP地址 - 计算机在网络中的唯一标识(编号)。
   底层是一个整数(4字节)IPV4,此外有IPV6。
   IP地址表示方式有两种:
        第一种 十六进制(8位18进制)
        第二种 点分十进制 (0-255的4个整数,用.隔开)
    192.168.100.2(点分十进制) 人的习惯
    C0  A8  64 02(十六进制)  计算机的习惯
    有时候需要进行 表示方式的装换

   网址(域名) 是转换成ip以后才能定位计算机。
   域名解析服务器 就是 把 域名 解析成ip。
   IP地址和Mac地址(网卡地址)绑定在一起,Mac是每个网卡在出厂前设定的,保证唯一。
   计算机中 有多个进程在运行,端口号 负责 代表计算机中的一个进程。
   所以,网络编程 就是 IP和端口的开发。

unix c 09的更多相关文章

  1. Windows7WithSP1/TeamFoundationServer2012update4/SQLServer2012

    [Info   @09:03:33.737] ====================================================================[Info   @ ...

  2. 设置 Unix,Linux环境下的NLS_LANG

    设置 NLS_LANG 变量 1) 正确配置 LC_ALL 参数 2) 配置 telnet/ssh/SecureCRT 客户端的字符集 linux中可以用locale命令来查看 NLS_LANG设置, ...

  3. UNIX常用命令

    以下只说明各常用指令的基本用法, 若需详细说明, 请用 man 去读详细的 manual. 1.关於档案/目录处理的命令 ls--列目录 这是最基本的档案指令. ls 的意义为 "list& ...

  4. [转] 将DOS格式文本文件转换成UNIX格式

    点击此处阅读原文 用途说明 dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter).DOS下的文本文 ...

  5. unix环境高级编程基础知识之第二篇(3)

    看了unix环境高级编程第三章,把代码也都自己敲了一遍,另主要讲解了一些IO函数,read/write/fseek/fcntl:这里主要是c函数,比较容易,看多了就熟悉了.对fcntl函数讲解比较到位 ...

  6. 编写 unix和 windows的 Scala 脚本

    编写 unix和 windows的 Scala 脚本 今天在看<Scala 编程>的时候看到附录了,里面提到了怎么在 unix 和 windows 下面编写 scala 脚本. 之前我也一 ...

  7. UNIX Time 时间戳 与 北京时间 相互转换

    typedef struct t_xtime { int year; int month; int day; int hour; int minute; int second; } _xtime ; ...

  8. UNIX索引技术访问文件初阶

    背景: 软考里面,多次碰到一道题: 过程 以前对于这样的题,仅仅知道: 在文件系统中,文件的存储设备通常划分为若干个大小相等的物理块,每块长为512或1024字节.文件的理结构是指文件在存储设备上的存 ...

  9. Unix 初步(一)

    1.Unix文件系统 Unix文件系统有三种文件类型:普通文件.目录文件和设备文件(将外部设备作为一种特殊的文件进行管理,实现输入输出统一而单纯的操作.) 2.Unix的网络功能 TCP/IP 3.r ...

随机推荐

  1. NOI2013 UOJ122 向量内积

    神题...... 还是大神讲得比较清晰~orz http://dffxtz.logdown.com/posts/197950-noi2013-vector-inner-product 启发题:poj3 ...

  2. JVM基础和调优(五)

    垃圾回收算法中收集器 接着上面的说,了解了JVM收集垃圾的过程,然后我们看一看收集器. 串行收集器:用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所 ...

  3. bzoj2929 [Poi1999]洞穴攀行

    Description 一队洞穴学者在Byte Mountain的Grate Cave里组织了一次训练.训练中,每一位洞穴学者要从最高的一个室到达最底下的一个室.他们只能向下走.一条路上每一个连续的室 ...

  4. jQuery中ajax的使用和缓存问题解决 $getjson 与$get都会被IE缓存

    原文地址:http://www.cnblogs.com/fullhouse/archive/2012/01/17/2324842.html 1:GET访问 浏览器 认为 是等幂的就是 一个相同的URL ...

  5. BaseAdapter自定义适配器——思路详解

    BaseAdapter自定义适配器——思路详解 引言: Adapter用来把数据绑定到扩展了AdapterView类的视图组.系统自带了几个原生的Adapter. 由于原生的Adapter视图功能太少 ...

  6. 【剑指offer】面试题37:两个链表的第一个公共结点

    题目: 输入两个链表,找出它们的第一个公共结点. 思路: 由链表的定义知是单链表.对于单链表,如果两个链表有公共结点,则两个链表必然是像Y型相交.则先计算出各个链表的长度,让长链表的头指针先走多出来的 ...

  7. java_重写与重载的区别

    重写与重载的区别 重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念.但是对于新手来说也比较容易混淆.本文通过两个简单的例子说明了他们之间的区别. 定义 重载 ...

  8. 对easyui datagrid进行扩展,当滚动条拉直最下面就异步加载数据。

    以下方法是通用的,只要把datagrid定义为全局的即可,其他部分的代码不用进行修改! 可以把以下代码放入到一个单独的js文件,然后再需要的页面引入即可! $(function(){ try{ $(& ...

  9. QT正则表达式---针对IP地址

    判断合法IP的QT正则表达式: bool IsIPaddress(QString ip) { QRegExp rx2("(//d+)(//.)(//d+)(//.)(//d+)(//.)(/ ...

  10. android studio 开发android app 真机调试

    大家都知道开发android app 的时候可以有2种调试方式, 一种是Android Virtual Device(虚拟模拟器) ,另一种就是真机调试. 这里要说的是真机调试的一些安装步骤: 1. ...