进程间通信之:IPC

来源:互联网 发布:淘宝店铺插件 编辑:程序博客网 时间:2024/05/22 01:29

IPC(Interprocess Communication)

有三种称做XSI IPC的IPC:消息队列(message queues)、信号量(semaphores)、以及共享内存(shared memory)。XSI是什么意思?有知道的烦请留言告知。

标识符(identifier)和键(key)

  每个内核中的IPC结构(消息队列, 信号量和共享存储段)都用一个非负整数的标识符来加以引用。要向一个队列中发送消息或读取消息只需要知道其队列标识符即可。
  该标识符与文件描述符不同的是, 创建时并不会重复利用通过删除回收的整数, 而是每次+1, 直到整数最大值回转到0。
  标识符是IPC对象的内部名, 而它的外部名则是key(键),。
  无论何时创建IPC结构(通过调用msgget、semget、shmget),都应该指定一个key,key的基本类型是key_t, 在头文件<sys/types.h>中定义,key由内核变换成identifier。

客户进程和服务器进程共同操作同一个IPC结构方法

  (1) 服务器进程可以指定键IPC_PRIVATE创建一个新的IPC结构,将返回的标识符存放在某处(如一个文件)以便和客户进程取用。
  缺陷:需要服务进程将标识符(identifier)写到文件中,客户进程使用时候还需要读取文件。
  (2) 在一个公用头文件 中定义 一个客户进程和服务器进程都认可的键。然后服务器进程指定此键创建一个新的IPC结构。
  下面代码以消息队列为例说明。

#define MSGKEY 1024 msqid=msgget(MSGKEY,IPC_EXCL);

  缺陷:宏定义的键值,可能已经有一个IPC结构与其结合,从而导致创建失败。
  (3) 客户进程和服务器进程认同一个路径和项目ID(项目ID是0~255间的字符值),接着调用函数ftok将这两个值变换一个键。然后在方法(2)中使用此键。

#inlcude <sys/ipc.h>key_t ftok(const char *path, int projid);

  path 参数必须引用一个现存文件,如果想填写当前目录则用”.”。在一般的UNIX实现中,是将文件的索引节点号取出,再加上projid得到对应的key值。
  缺陷:文件的索引节点号使用long long保存的,而key是int结构,因此在计算过程中存在对文件索引节点号进行截取的可能,不同路径的文件同样可能产生相同的key。

权限结构

XSI IPC为每一个IPC结构关联了一个ipc_perm结构,perm是 permission的简写。

struct ipc_perm{    key_t key;    uid_t uid ; /* owner's effective user id */    gid_t gid ; /* owner's effective group id */    uid_t cuid; /* creator's effective user id */    gid_t cgid ; /* creator's effective group id */    mode_t mode; /* access modes */    ulong seq ; /* slot usage sequence number */};/* 这里只是举例,内核中该结构成员也是在发生变化的,但是基本的元素一直保持不变,该结构体一般是其他IPC结构的第一个成员,例如消息队列的IPC结构声明为 */struct msqid_ds {    struct ipc_perm msg_perm;    ..............}

  在创建IPC结构时,对所有字段都赋初值。以后,可以调用msgctl、semctl或shmctl修改uid、gid和mode字段。
  改变这些值,调用进程必须是IPC结构的创建者或超级用户。

消息队列查看

  系统进行进程间通信(IPC)的时候,可用的方式包括信号量、共享内存、消息队列、管道、信号(signal)、套接字等形式。使用IPCS可以在Linux系统下查看共享内存、信号量、消息队列的状态。
  
各参数如下 :
-m shared memory segments
-q message queues
-s semaphore arrays
-a all (this is the default)

下面列出消息队列常用的命令
注:环境中没有消息存在,所以示例只显示了命令执行时每一列的条目
- 列表内容

ipcs -q : 显示所有的消息队列

       —— Message Queues ——– key msqid owner perms used-bytes messages

ipcs -qt : 显示消息队列的创建时间,发送和接收最后一条消息的时间

   —— Message Queues Send/Recv/Change Times ——–  msqid    owner    send    recv    change

ipcs -qp: 显示往消息队列中放消息和从消息队列中取消息的进程ID

    —— Message Queues PIDs ——– msqid owner lspid lrpid 其中lspid含义是最后一个send进程,lrpid含义是最后一个receive进程

ipcs -q -i msgid: 显示msgid对应的消息队列结构体中的信息

ipcs -ql : 显示消息队列的限制信息

      —— Messages: Limits ——– max queues system wide = 31868 max size of message (bytes) = 65536 default max size of queue (bytes) = 65536
1 0
原创粉丝点击