zoukankan      html  css  js  c++  java
  • unix c 09

    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和端口的开发。

  • 相关阅读:
    leetcode231 2的幂 leetcode342 4的幂 leetcode326 3的幂
    leetcode300. Longest Increasing Subsequence 最长递增子序列 、674. Longest Continuous Increasing Subsequence
    leetcode64. Minimum Path Sum
    leetcode 20 括号匹配
    算法题待做
    leetcode 121. Best Time to Buy and Sell Stock 、122.Best Time to Buy and Sell Stock II 、309. Best Time to Buy and Sell Stock with Cooldown 、714. Best Time to Buy and Sell Stock with Transaction Fee
    rand7生成rand10,rand1生成rand6,rand2生成rand5(包含了rand2生成rand3)
    依图
    leetcode 1.Two Sum 、167. Two Sum II
    从分类,排序,top-k多个方面对推荐算法稳定性的评价
  • 原文地址:https://www.cnblogs.com/elisha-blogs/p/3771172.html
Copyright © 2011-2022 走看看