system v ipc对象是靠标识符ID来识别和操作的,具有系统唯一性.意思就是说,该ID是操作系统内的全局变量,只要具有权限,任何进程都可以通过标识符进行进程间的通信.
获取标识符ID的函数为int msgget(key_t key, int msgflg),其中参数key会被msgget函数转换为相应的IPC标识符.而key有三种选择方式:
1\随机获取一个整数的方式获取key.
2\使用IPC_PRIVATE,即msgget(IPC_PRIVATE, S_IRUSR|S_IWUSR),使用该方式总是会创建一个新的IPC对象,此方式一般适用于父子进程间的通信.父进程fork之前创建IPC对象,而后,子进程自然继承了IPC标识符,故父子进程可以进行通信.该方式在同一个进程中所产生的key每次都不一样,而且会出现在ipcs命令输出中<message queues>中.
3\使用ftok函数.其含义是将一个显式的文件名生成一个key,因此,只要知道该文件名,即可得到同一个key,那么多个进程通过key就可以实现通信.

实验代码

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ipc.h> #define FILEPATH "/tmp/mkfifo.0001" int main(int argc, char *argv[])
{
printf("-------+++++++++ftok+++++++++-------\n");
/* 0x1122可以理解为一个种子,但ftok只会用到其高8位的数值,其余的丢弃 */
/* 比如,同一个filepath,0x1122和0x2122所生成的key一样;而0x1122和0x1123生成的key则不一样 */
key_t mykey_1122 = ftok(FILEPATH, 0x1122);
key_t mykey_1123 = ftok(FILEPATH, 0x1123);
key_t mykey_2123 = ftok(FILEPATH, 0x2123);
if(mykey_1122 != -1 & mykey_1123 != -1 & mykey_2123 != -1)
{
printf("ftok succeed, filepath : %s\nmykey_1122 : %d\n", FILEPATH, mykey_1122);
printf("mykey_1123 : %d\n", mykey_1123);
printf("mykey_2123 : %d\n\n", mykey_2123);
}
else
printf("ftok failed, app exit!\n"); printf("-------+++++++++IPC_PRIVATE+++++++++-------\n");
key_t ipckey_1 = msgget(IPC_PRIVATE, S_IRUSR|S_IWUSR); /* S_IRUSR:用户读权限,S_IWUSR:用户写权限 */
key_t ipckey_2 = msgget(IPC_PRIVATE, S_IRUSR|S_IWUSR);
printf("IPC_PRIVATE key_1 : %d\n", ipckey_1);
printf("IPC_PRIVATE key_2 : %d\n", ipckey_2); return 0;
}

附注:

IPC对象的权限(类似于文件权限,也可8进制累加)
IPC对象的权限分为3类,分别是owner,group和other.其中
owner->S_IRUSR:0400, S_IWUSR:0200
group->S_IRGRP:0040, S_IWGRP:0020
other->S_IROTH:0004, S_IWOTH:0002
权限的组合既可以使用预定义的数值,也可以使用八进制数值累加.如msgget(key,IPC_CREAT|0600)等价于msgget(key,IPC_CREAT|S_IRUSR|S_IWUSR)

system v ipc的标识符ID的更多相关文章

  1. 《Unix网络编程》卷2 读书笔记 第3章- System V IPC

    1. 概述 三种类型的System V IPC:System V 消息队列.System V 信号量.System V 共享内存区 System V IPC在访问它们的函数和内核为它们维护的信息上共享 ...

  2. System V IPC 之共享内存

    IPC 是进程间通信(Interprocess Communication)的缩写,通常指允许用户态进程执行系列操作的一组机制: 通过信号量与其他进程进行同步 向其他进程发送消息或者从其他进程接收消息 ...

  3. System V IPC 之信号量

    本文继<System V IPC 之共享内存>之后接着介绍 System V IPC 的信号量编程.在开始正式的内容前让我们先概要的了解一下 Linux 中信号量的分类. 信号量的分类 在 ...

  4. System V IPC 之消息队列

    消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...

  5. 四十九、进程间通信——System V IPC 之消息队列

    49.1 System V IPC 介绍 49.1.1 System V IPC 概述 UNIX 系统存在信号.管道和命名管道等基本进程间通讯机制 System V 引入了三种高级进程间通信机制 消息 ...

  6. System V IPC

    1.概述 System V IPC共有三种类型:System V消息队列.System V 信号量.System V 共享内存区. System V IPC操作函数如下: 2.key_t键和ftok函 ...

  7. UNIX 进程间通讯(IPC)概念(Posix,System V IPC)

     IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对 ...

  8. System V IPC相关函数

    System V IPC 将一个已保存的路径名和一个整数标识符转换成一个key_t值,称为IPC键key_t:System V IPC(System V消息队列.System V信号量.System ...

  9. Linux 系统编程 学习:04-进程间通信2:System V IPC(1)

    Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...

随机推荐

  1. codeforces547a

    http://codeforces.com/contest/547/problem/A 题意:确定是否在某一时刻高度都同时为a1和a2. step1:找到青蛙首次到a1的时间pri1以及重复到a1的周 ...

  2. 关于新手用java写题目,遇到的字符和字符串问题

    我看到一遍很好的博客: https://blog.csdn.net/qq_37267015/article/details/78738512 1.首先了,java之中,没有像C语言那样的getchar ...

  3. 欧拉函数 牛客寒假1 小a与黄金街道

    题目链接 分析:这题用到了欧拉函数, 欧拉函数,用φ(n)表示 欧拉函数是求小于等于n的数中与n互质的数的数目 详细可以看看这篇博文https://www.cnblogs.com/linyujun/p ...

  4. C++的字符串多行输入

    #include<iostream> using namespace std; int main() { int r, c; char grid[50][51]; cout << ...

  5. 创建属性Attribute

    XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); var root = xmlDoc.DocumentElement;//取到 ...

  6. .net 基础

    之前给大家总结了java的面试几次技巧总结,同学们看了觉得还是不错,能够得到大家的认可,感觉还是挺不错的.现在又有同学来想小编索要.NET面试的总结了,好吧.谁让小编这么好呢!以下是.NET面试之框架 ...

  7. zzw原创_expdp及impdp中的exclude及include参数的那点事

    zzw原创:转载请注明出处 在oracle的expdp 及imdpd命令中,exclude及include参数还是有一些要注意的地方,特别是涉及选择性条件时. 一.通用 1.exclude及inclu ...

  8. [Uva P11168] Airport

    题目是英文的,这里就不给出来了. 题目的大意是说,在平面上有n个点,要找一条直线,使所有点到直线的平均距离最小,且这些点都在该直线的同一侧(包括直线上). 那么,既然要使距离最小化,还要使所有点一定在 ...

  9. npm run build 打包后,如何运行在本地查看效果(Apache服务)

    目前,使用vue-cli脚手架写了一个前端项目,之前一直是使用npm run dev 在8080端口上进行本地调试.项目已经进行一半了,今天有时间突然想使用npm run build进行上线打包,试试 ...

  10. hibernate配置log

    hibernate依赖jboss-logging,通过它选择对应的对应的日志包,选择的逻辑课查看具体代码org.jboss.logging.LoggerProviders. 先通过系统变量(org.j ...