博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程间通信(1) - IPS概述
阅读量:4071 次
发布时间:2019-05-25

本文共 1898 字,大约阅读时间需要 6 分钟。

目录


1. IPS概述

    IPS全称是Inter-Process Communication(进程间通信),指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位(严格说来是线程)。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。这些进程可以运行在同一台计算机上或连网的不同计算机上。

    Linux中,与IPC相关的命令包括:ipcs、ipcrm。

2. 查看IPS对象

    IPCS命令是Linux下显示进程间通信设施状态的工具,可以查看共享内存、信号量、消息队列的状态。

    具体的用法总结如下:

   # ipcs -a                                       //显示所有的IPC设施
   # ipcs -q                                       //显示所有的消息队列
   # ipcs -s                                       //显示所有的信号量
   # ipcs -m                                     //显示所有的共享内存
   # ipcs -q<-m/-s> -i id                   //显示IPC设施的详细信息。其中,id 对应shmid、semid、msgid等
   # ipcs-q<-m/-s> -l                        //显示IPC设施的限制大小
   # ipcs <-m/-q/-s> -c                     //显示IPC设施的权限关系
   # ipcs <-m/-q> -p                        //显示最近访问过IPC设施的进程ID
   # ipcs <-m/-q/-s> -t                     //显示IPC设施的最后操作时间
   # ipcs -u                                     //显示IPC设施的当前状态

3. 删除IPS对象

    ipcrm命令用于移除一个消息对象,或共享内存段,或一个信号集,同时会将与ipc对象相关联的数据也一起移除。

    只有root用户,或IPC对象的创建者才能执行此操作。
    具体的用法总结如下:
    # ipcrm -M shmkey                //移除用shmkey创建的共享内存段。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。
    # ipcrm -m shmid                   //移除用shmid标识的共享内存段。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。
    # ipcrm -Q msgkey                //移除用msqkey创建的消息队列和数据结构
    # ipcrm -q msgid                   //移除用msgid标识的消息队列和数据结构
    # ipcrm -S semkey                //移除用semkey创建的信号和数据结构
    # ipcrm -s  semid                  //移除用semid标识的信号和数据结构

4. ftok函数

    System V中,主要存在下面3种IPC方式:

    System V消息队列,System V信号量,System V共享内存区。
    这三种类型的IPC都使用key_t值做为它们的名字。
    key_t这个数据类型定义在<sys/types.h>中,通常是一个至少32位整数。
    通常使用ftok()函数把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC键。
    函数原型:

#include 
/* Generates key for System V style IPC. */key_t ftok (const char *pathname, int proj_id); // 成功返回IPC键,失败返回-1;

    参数说明:

    pathname 通常是跟本应用有关的目录(必须存在并且能访问),proj_id指的是本应用所用到的IPC的一个序列号.

    函数说明:

    两进程如在pathname和proj_id上达成一致(约定好),双方就都能够通过调用ftok函数得到同一个IPC键。根据APUE(2rd), Item518所讲,ftok的实现是组合了三个值的:
    --pathname所在文件系统的信息(stat结构的st_dev成员)
    --pathname在本文件系统内的索引节点号(stat结构的st_ino成员)
    --id的低序8位(不能为0)
    具体如何组合的,根据系统实现而不同。例如:假设指定文件的索引节点号为65732,换算成16进制为0x0100C4,而指定的ID值为35,换算成16进制为0x23,则最后的key_t返回值为0x230100C4。

    注意事项:

    使用ftok()需要注意的问题:
    --pathname指定的目录(文件)必须真实存在且调用进程可访问,否则ftok返回-1;
    --pathname指定的目录(文件)不能在程序运行期间删除或创建。因为文件每次创建时由系统赋予的索引节点可能不一样。这样一来,通过同一个pathname与proj_id就不能保证生成同一个IPC键。

你可能感兴趣的文章
如何成为编程高手
查看>>
本科生的编程水平到底有多高
查看>>
备忘:java中的递归
查看>>
Solr及Spring-Data-Solr入门学习
查看>>
python_time模块
查看>>
python_configparser(解析ini)
查看>>
selenium学习资料
查看>>
<转>文档视图指针互获
查看>>
从mysql中 导出/导入表及数据
查看>>
HQL语句大全(转)
查看>>
几个常用的Javascript字符串处理函数 spilt(),join(),substring()和indexof()
查看>>
javascript传参字符串 与引号的嵌套调用
查看>>
swiper插件的的使用
查看>>
layui插件的使用
查看>>
JS牛客网编译环境的使用
查看>>
9、VUE面经
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>