• IPC相关的命令


    进程间通信概述

    进程间通信有如下的目的:

      1、数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间;

      2、共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到;

      3、通知事件,一个进程需要向另一个或一组进程发送消息,通知它们发生了某件事情;

      4、资源共享,多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制;

      5、进程控制,有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

    Linux进程间通信由以下几部分发展而来:

      早期UNIX进程间通信:包括管道、FIFO、信号。

      基于System V的进程间通信:包括System V消息队列、System V信号灯(Semaphore)、System V共享内存。

      基于Socket进程间通信。

      基于POSIX进程间通信:包括POSIX消息队列、POSIX信号灯、POSIX共享内存。

    Linux中,与IPC相关的命令包括:ipcs、ipcrm(释放IPC)、

    IPCS命令是Linux下显示进程间通信设施状态的工具。我们知道,系统进行进程间通信(IPC)的时候,可用的方式包括信号量、共享内存、消息队列、管道、信号(signal)、套接字等形式。使用IPCS可以查看共享内存、信号量、消息队列的状态。

    ipcs

    1. 命令格式

      ipcs [resource-option] [output-format]
      ipcs [resource-option] -i id

    2. 命令功能

      提供IPC设备的信息

    3. 使用方法

     resource选项:

      ipcs -m  查看系统共享内存信息

      ipcs -q  查看系统消息队列信息

      ipcs -s  查看系统信号量信息

      ipcs [-a] 系统默认输出信息,显示系统内所有的IPC信息

    复制代码
    [martin@localhost data]$ ipcs -a
    
    ------ Message Queues --------
    key        msqid      owner      perms      used-bytes   messages    
    
    ------ Shared Memory Segments --------
    key        shmid      owner      perms      bytes      nattch     status      
    0x00000000 229376     martin     600        4194304    2          dest         
    0x00000000 196609     martin     600        524288     2          dest         
    0x00000000 327682     martin     600        393216     2          dest         
    0x00000000 491525     martin     600        2097152    2          dest         
    
    ------ Semaphore Arrays --------
    key        semid      owner      perms      nsems     
    复制代码

    第一列就是共享内存的key;

    第二列是共享内存的编号shmid;

    第三列就是创建的用户owner;

    第四列就是权限perms;

    第五列为创建的大小bytes;

    第六列为连接到共享内存的进程数nattach;

    第七列是共享内存的状态status。其中显示“dest”表示共享内存段已经被删除,但是还有用户在使用它,当该段内存的mode字段设置为 SHM_DEST时就会显示“dest”。当用户调用shmctl的IPC_RMID时,内存先查看多少个进程与这个内存关联着,如果关联数为0,就会销 毁这段共享内存,否者设置这段内存的mod的mode位为SHM_DEST,如果所有进程都不用则删除这段共享内存

    输出格式控制:

      ipcs -c  查看IPC的创建者和所有者

      ipcs -l  查看IPC资源的限制信息

      ipcs -p  查看IPC资源的创建者和使用的进程ID

      ipcs -t  查看最新调用IPC资源的详细时间

      ipcs -u  查看IPC资源状态汇总信息

    复制代码
    [martin@localhost data]$ ipcs -u --human
    
    ------ Messages Status --------
    allocated queues = 0
    used headers = 0
    used space = 0B
    
    ------ Shared Memory Status --------
    segments allocated 4
    pages allocated 1760
    pages resident  339
    pages swapped   0
    Swap performance: 0 attempts     0 successes
    
    ------ Semaphore Status --------
    used arrays = 0
    allocated semaphores = 0
    复制代码

     额外格式控制:

      ipcs -l --human

        以人类可以阅读的方式显示size

    复制代码
    [martin@localhost data]$ ipcs -l --human
    
    ------ Messages Limits --------
    max queues system wide = 3644
    max size of message = 8K
    default max size of queue = 16K
    
    ------ Shared Memory Limits --------
    max number of segments = 4096
    max seg size = 16E
    max total shared memory = 16E
    min seg size = 1B
    
    ------ Semaphore Limits --------
    max number of arrays = 128
    max semaphores per array = 250
    max semaphores system wide = 32000
    max ops per semop call = 32
    semaphore max value = 3276
    复制代码

     附:

    1、显示所有的IPC设施
    
    # ipcs -a
    
    2、显示所有的消息队列Message Queue
    
    # ipcs -q
    
    3、显示所有的信号量
    
    # ipcs -s
    
    4、显示所有的共享内存
    
    # ipcs -m
    
    5、显示IPC设施的详细信息
    
    # ipcs -q -i id
    
    id 对应shmid、semid、msgid等。-q对应设施的类型(队列),查看信号量详细情况使用-s,查看共享内存使用-m。
    
    6、显示IPC设施的限制大小
    
    # ipcs -m -l
    
    -m对应设施类型,可选参数包括-q、-m、-s。
    
    7、显示IPC设施的权限关系
    
    # ipcs -c
    
    # ipcs -m -c
    
    # ipcs -q -c
    
    # ipcs -s -c
    
    8、显示最近访问过IPC设施的进程ID。
    
    # ipcs -p
    
    # ipcs -m -p
    
    # ipcs -q -p
    
    9、显示IPC设施的最后操作时间
    
    # ipcs -t
    
    # ipcs -q -t
    
    # ipcs -m -t
    
    # ipcs -s -t
    
    10、显示IPC设施的当前状态
    
    # ipcs -u
    
    Linux上的ipcs命令,不支持UNIX上的-b、-o指令,同样UNIX中不支持-l、-u指令,所以在编写跨平台的脚本时,需要注意这个问题。
    
     
    
    下面的命令可以释放所有已分配的共享内存:
    
    ipcs -m | awk '$2 ~ /[0-9]+/ {print $2}' | while read s; do sudo ipcrm -m $s; done
    

    ipcrm

    1. 命令功能

      通过指定ID删除删除IPC资源,同时将与IPC对象关联的数据一并删除,只有超级用户或IPC资源创建者能够删除

    2. 使用方法

      ipcrm -M shmkey

        移除用shmkey创建的共享内存段

      ipcrm -m shmid

        移除用shmid标识的共享内存段

      ipcrm -S semkey

        移除用semkey创建的信号量

      ipcrm -s semid

        移除用semid标识的信号量

      ipcrm -Q msgkey

        移除用msgkey创建的消息队列

      ipcrm -q msgid

        移除用msgid标识的消息队列

  • 相关阅读:
    两种方式创建Maven项目【方式二】
    两种方式创建Maven项目【方式一】
    《Java程序设计》第二周学习记录(1)
    《Java程序设计》第一周学习记录(2)
    《Java程序设计》第一周学习记录(1)
    《Java程序设计》第一周学习总结
    Python isinstance
    笔记:Struts2 Action 非泛型集合元素类型转换
    笔记:Struts2 输入校验
    笔记:Struts2 国际化
  • 原文地址:https://www.cnblogs.com/jjzd/p/6773090.html
Copyright © 2020-2023  润新知