进程间通信(IPC, inter-process communication)实现进程间消息的传递,对于用户地址空间相互独立的两个进程而言,实现通信可以通过以下方式:

  • 由内核层面分配内存,两进程共享该段内存
  • 两进程读/写同一磁盘文件,通过文件内容实现通信

Linux提供了以下具体方法:

  1. 管道(pipes):一个进程可通过管道向另一个进程传递消息,不同机器上的进程可通过命名管道相互通信
  2. 共享内存(shared memory):进程可通过共享内存交换数据,一个进程负责创建共享内存,其他进程可以连接该块内存
  3. 消息队列(message queue):由队列结构管理的内存块,其中内存块中放置进程数据
  4. 信号(semaphores):在进程访问共享资源时,信号提供同步机制,其不负责传递其他信息

ipcs是Unix/Linux中的一个用于显示进程间通信信息的命令,其可列出进程间的共享内存、消息队列、信号信息,下面是ipcs的具体用法。

1.列出ipc列表

使用 -a 选项将列出所有ipc信息:

# ipcs -a
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0xc616cc44 1056800768 oracle    660        4096       0
0x0103f577 323158020  root      664        966        1
0x0000270f 325713925  root      666        1          2

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x0103eefd 0          root      664        1
0x0103eefe 32769      root      664        1
0x4b0d4514 1094844418 oracle    660        204

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages
0x000005a4 32768      root       644        0            0

以上列出了进程间共享内存、信号和消息队列,注意每种 ipc 以 key 和 id 进行标识。-m选项单独列出共享内存信息,-s选项单独列出信号信息,-q选项单独列出消息队列信息。

2.显示ipc信息详情

使用 -i 选项可以显示某 id 的ipc信息详情,如以下显示shmid为65537的共享内存详情:

# ipcs -m -i 65537

Shared memory Segment shmid=65537
uid=1000    gid=100    cuid=1000    cgid=100
mode=01600    access_perms=0600
bytes=393216    lpid=3406    cpid=3400    nattch=2
att_time=Mon Apr  8 13:45:50 2013
det_time=Mon Apr  8 13:45:50 2013
change_time=Mon Apr  8 13:45:50 2013

3.查看ipc限制

内核对各种ipc有一些限制,例如最大的共享内存块数,每块共享内存最大/最小值,使用 -l 选项可显示这些限制:

# ipcs -m -l

------ Shared Memory Limits --------
max number of segments =
max seg size (kbytes) =
max total shared memory (kbytes) =
min seg size (bytes) = 

直接使用 ipcs -l 可查看到对三种ipc的限制。

4.显示ipc创建者与拥有者详情

-c 选项可以显示ipc创建者和ipc拥有者的 userid、groupid:

# ipcs -m -c

------ Shared Memory Segment Creators/Owners --------
shmid      perms      cuid       cgid       uid        gid
              root       root       root       root
              lx         users      lx         users
              lx         users      lx         users

5.显示最近访问ipc的进程pid

-p 选项可以显示哪些进程最近访问了某类ipc:

# ipcs -m -p

------ Shared Memory Creator/Last-op --------
shmid      owner      cpid       lpid
      root
      lx                  

6.显示最近访问时间点

-t 选项显示对ipc最近的操作或连接时间点,对不同的ipc有不同的含义:

  • 对于消息队列, -t 显示最近接收和发送时间点
  • 对于共享内存,-t 显示最近开始访问和结束访问时间点
  • 对于信号,-t 显示最近操作和信号变更时间点
# ipcs -s -t

------ Semaphore Operation/Change Times --------
semid    owner      last-op                    last-changed
        lx          Mon Apr   ::    Mon Apr   ::  

7.显示当前使用状态

使用 -u 选项可以显示ipc当前使用状况:

# ipcs -u

------ Shared Memory Status --------
segments allocated
pages allocated
pages resident
pages swapped
Swap performance:  attempts      successes

------ Semaphore Status --------
used arrays =
allocated semaphores = 

------ Messages: Status --------
allocated queues =
used headers =
used space =  bytes

Reference: 10 IPCS Command Examples (With IPC Introduction)

进程间通信与ipcs使用7例的更多相关文章

  1. 一起talk C栗子吧(第九十 三回:C语言实例--进程间通信之临界资源)

    各位看官们.大家好,前面章回中咱们说的是使用信号和管道进行进程间通信的样例.这一回咱们说的样例是:进程间通信之临界资源.闲话休提,言归正转.让我们一起talk C栗子吧! 我们首先介绍一下,什么是临界 ...

  2. Linux工具参考篇(网摘)

    Linux工具参考篇 原文出处:[Linux Tools Quick Tutorial] 1. gdb 调试利器 2. ldd 查看程序依赖库 3. lsof 一切皆文件 4. ps 进程查看器 5. ...

  3. 进程间通信 ipcs

    在linux系统上借助ipcs命令可以方便地查看进程间通信状态 操作系统:centos7.3 x86_64 应用软件: oracle12c

  4. Linux进程间通信 共享内存+信号量+简单样例

    每个进程都有着自己独立的地址空间,比方程序之前申请了一块内存.当调用fork函数之后.父进程和子进程所使用的是不同的内存. 因此进程间的通信,不像线程间通信那么简单.可是共享内存编程接口能够让一个进程 ...

  5. 运维ps语法---》ps、pstree、top、htop、nice、renice、kill、ulimit、w 和 who 和 whoami、pgrep、fg 和 bg、ipcs

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  6. 进程间通信之-共享内存Shared Memory--linux内核剖析(十一)

    共享内存 共享内存是进程间通信中最简单的方式之中的一个. 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区. 共享内存同意两个或很多其他进程訪问同一块内存,就如同 malloc() 函数 ...

  7. Linux系统编程——进程间通信:共享内存

    概述 url=MdyPihmS_tWLwgWL5CMzaTrwDFHu6euAJJUAjKvlzbJmRw7RfhmkBWwAloo7Y65hLY-kQdHsbqWYP2wc2fk8yq"& ...

  8. Linux命令:ipcs/ipcrm命令

    ipcs/ipcrm命令  是linux/uinx上提供关于一些进程间通信方式的信息,包括共享内存,消息队列,信号 多进程间通信常用的技术手段包括共享内存.消息队列.信号量等等,Linux系统下自带的 ...

  9. 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等

    一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...

随机推荐

  1. SpringBoot使用Docker快速部署项目

    1.简介 建议阅读本文最好对Dokcer有一些了解 首先我们先了解一下Docker是什么 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口.它是目前最流行的 Linux 容器 ...

  2. ORACLE导入数据库详细步骤

    登录PLSQL 点击然后打开命令窗口执行命令 创建表空间(红色字体是你需要创建表空间的地址,蓝色的是表空间大小) create temporary tablespace ZJY_TEMP tempfi ...

  3. Json串排序

    最近遇到个很烦人的问题.我现在做的业务有一部分是把之前app服务端的.net接口转译java接口.但是有些之前的接口,一个接口干上十几件事情,返回的json串长达五六几百行.着实看的就让人头大.但是如 ...

  4. SQL Server 存储过程相关语法

    一.定义变量及赋值 1.1 普通变量 --定义变量 declare @parameter_set int ) ) --set 关键字赋值 ; --select 赋值 select @parameter ...

  5. C语言指针使用不当带来的内存不可读

    前几天遇到一个C语言初学者提到的一个问题,代码我做了一些修改,如下: #include <stdio.h> #include <string.h> int main(void) ...

  6. 【bfs】单向公路-C++

    描述 某地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,并且有的公路并不能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另一个城镇 ...

  7. while 循环,运算符,字符串的格式化

    1.while 关键字 (死循环) while 条件: 循环体 条件:只要条件是 Ture就可以循环. while 空格 条件 冒号 缩进 循环体 while else while 空格 条件 冒号 ...

  8. markdown浅谈

    markdown是啥? markdown就是一种修饰网页/博客的方法,他能使网页变得更美观. 我们先解释一下代码框: 这个没法保留,就是把键盘左上角的⋅·⋅ 切换成英文变成`. 然后``` 在隔一行` ...

  9. apache添加https证书

    今天折腾了一下,总结apache添加https证书的方法. 证书类型分为两种, A)自签名证书 利用oepnssl命令生成.csr和key文件,没有授信,没有有效期,但是可以强制使用https协议,可 ...

  10. win10 安装mysql(图文详情)避免卡在最后一步

    win10 安装mysql 本人安装mysql一般都是在镜像文件夹中下载(http://mirrors.sohu.com/),最近系统重做了之后安装mysql5.5.msi,可以安装成功.但是在最后的 ...