IPC之SystemV

svipc - System V interprocess communication mechanisms

linux实现的System V interprocess communication (IPC)机制包含消息队列(message queues),信号集(semaphore sets),和共享内存(shared memory segments)。

man 7 svipc

在新的应用中很少会用到System V IPC,因为它已经被POSIX IPC取代了。但编写老程序时仍可能用到。

像管道一样,IPC存在于内核(实际上是内核内存)而不是像FIFO一样存在于文件系统中。IPC的集中结构有时合起来叫做IPC对象(其实是信号灯、消息队列和共享内存)。

 每个对象都通过它的标识符来引用和访问,标识符是一个正整数,它唯一地标识出对象本身和它的类型。每个标识符的类型都是唯一的,但同一标识符的值可以用于一个消息队列、一个信号灯和一个共享内存区。标识符称为该结构上所有其他操作的句柄。IPC结构标识符不想文件描述符那样使用较小的正整数。实际上,随着结构的创建和删除,标识符的值(正式的名称叫做槽使用顺序号)会不断增加直至达到一个最大值为止,然后再转回到0并重新开始。在linux系统中,标识符声明为整数,所以它的值最大可能为65535。

     每个IPC结构都有get函数创建,在创建了一个IPC机构之后,使用同一个关键字(key)的get函数的后续调用不会创建新结构,但返回和现在结构相关的标识符。这可以让两个或两个以上的进程用同一关键字key调用get函数以建立一条IPC通道。

    接下来的问题是怎样确保所有要使用同一IPC结构的进程都使用相同的关键字。一种方法为,实际创建结构的进程给get函数传递IPC_PRIVATE关键字,这能保证创建一个新结构。然后创建IPC结构的进程把返回的标识符保存在其他进程能够访问的文件系统中。在父进程fork或exec一个子进程的场合,父进程可以把返回的标识符作为一个参数传递给创建子进程的函数exec。

     另一种传递关键字的方法是把它保存在公共的头文件中,这样一来所有包含了这个头文件的程序都能够访问到相同的关键字。这种方法引出的一个问题,没有进程直到它是正在创建一个新结构呢还是只访问已经由其他进程创建好的结构。这种方法带来的另外一个问题是关键字可能已经被另外一个无关的程序使用了。结果使用这个关键字的进程必须包含处理这种可能性的代码。

     第三种方法是用ftok函数,这个函数接受一个路径名和一个称为项目标识符的单个字符作为参数,返回一个关键字可以传递给get函数。有程序员保证所有的进程实现直到路径名和项目标识符。你可以使用前面提到过的方法之一:在公共的头文件中包含路径名和项目标识符,或者把他们保存在预定义的配置文件中。

    不幸的是,ftok有个严重的缺陷:它不能保证产生唯一的关键字,这一来出现了和前面讨论的第二种方法一样的问题。在下列情况下,ftok生成唯一的关键字:

>>当两个不同的符号链接到同一文件上。

>>当路径名的索引节点的前16个比特位具有相同的值。

>>当系统带有两个相同次设备号的硬盘时,在系统由多个磁盘控制器的情况下才会出现。主设备号不相同,但次设备号可以相同。

考虑到linux的ftok实现有弱点,所以强烈建议读者不使用它并且忽略它。

System V IPC有几个缺点,第一,和它提供的好处相比,其编程接口过于复杂。第二,IPC结构比其他资源,比如系统能够支持的文件数量或系统允许的活动进程数目等受到的限制大的多。第三,尽管是一种受限资源,但IPC结构却没有保留一个引用计数(它是一个记录使用结构的进程数目的计数器),因此System V IPC没有回收被丢弃的IPC结构的自动机制。最后,如前面所述,IPC结构只存在于内核中,文件系统不知道他们。因此,对他们的I/O操作需要学习另外一种编程接口。没有文件描述符,你不能通过系统调用select使用多路复用的I/O。如果进程需要等待IPC结构上的I/O操作,它必须使用某种忙等待循环。一个忙等待循环--持续检查某些变化条件的循环--几乎在任何时刻都是一种糟糕的编程习惯,因为它不必要的消耗了CPU周期。在linux下,忙等待循环特别有害,有几种方法,比如阻塞I/O、使用系统调用select和信号来实现非忙等待的循环。

推荐使用POSIX IPC

转载于:https://www.cnblogs.com/embedded-linux/p/5080011.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle create user

sqlplus /nolog conn sys/pw123456orcl as sysdba CREATE USER zengwenfeng IDENTIFIED BY zengwenfeng ; GRANT ALL PRIVILEGES TO zengwenfeng ; COMMIT; C:\Users\Administrator>sqlplus /nologSQL*Plus: Release 11.2.0.1.0 Production on 星期日 12月 24 21:38:24 20…

具有GlassFish和一致性的高性能JPA –第2部分

在我的四部分系列的第二部分中,我将解释将Coherence与EclipseLink和GlassFish一起使用的策略第一。这描述了配置Coherence的JPA支持的Cache所必须采取的步骤,以及如何在GlassFish中使用它。高性能数据存储。 一般的做法 您可以将Coherence API与通过JPA映…

arm板telnetd为什么运行不了_一种基于ARM的嵌入式系统开发的方案详细讲解

背景介绍在日益信息化的社会中,各种各样的嵌入式系统已经全面渗透到日常生活的每一个角落。嵌入式系统的功能越来越复杂,这就使得一个嵌入式系统产品从市场需求立项到方案选择、样机研制、定型量产所需要的开发费用越来越多,所需开发时间越来…

反素数 -- 数学

反素数就是区间内约数个数最多的那个数。 在ACM题目里, 一般是求约数最多而且数字最小的那个数,【1--n】 二是求约数刚好等于n的最小的那个数 三是求区间里的最小反素数【beign,end】 1和3有区别吗?有,1可以加速&#…

编程挑战系统的输入和输出详细说明

在高校俱乐部线上编程挑战中,一道题目的所有测试数据是放在一个文本文件中,选手将一道题目的程序提交给评判系统运行,程序从该文件中读取测试数据,再把运行结果输出到另一个文本文件中。系统把输出文件与标准答案比对,…

上传文件---未能找到路径“D:\MyProject\Files\”的一部分

C# 使用控件FileUpload 上传文件,简单实例: protected void btnUpload_Click(object sender, EventArgs e){string path Server.MapPath("~/Files/");if (fileUpload.HasFile true){string filename fileUpload.FileName.ToLower();fileUpl…

使用SPANN方式将Spring&Quartz与自定义注释集成

在上一篇文章中 ,我们演示了如何在Spring容器中创建和配置带批注的Quartz作业。 我们使用了一个类级别的注释将一些元数据添加到实现Quartz Job的bean中。 批注定义了作业的名称,组及其cron表达式。 后来,大部分代码专用于处理该批注&#xf…

python opencv旋转_Python opencv实现与rotatedrect类似的矩形旋转,pythonopencv,RotatedRect

本文原理:先旋转矩形到指定角度,然后提取矩形外轮廓,从而获取旋转后的矩形坐标点。#!/usr/bin/env python3# -*- coding: utf-8 -*-# Author: tcy# Date: 2020-5-2 21:00:53# Version:V1.01# Last Modified by: tcy shanghai song…

关于string转整数

又是leetcode的easy级别题,很基本的题目,却漏考虑很多情况,动手前一定要考虑清楚呀!!! 就当做锻炼写作能力吧,先上题目! 将文本转换成整数,注意一下几点: 1.文…

数字三角形——递归、递推、记忆化搜索

数字三角形 描述: 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数。 问题: 从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行…

Java 7功能概述

前面我们讨论了所有未纳入Java 7的内容,然后回顾了将其纳入Java 7的有用的Fork / Join框架 。 今天的帖子将带我们了解Project Coin的每个功能-一系列小的语言增强功能,这些功能虽然不是开创性的,但是对于任何能够使用JDK 7的开发人员来说都是…

缓存技术

提升系统性能的主要方式之一就是缓存。它可以挡掉大部分的数据库访问的冲击,如果没有它,系统很可能会因为数据库不可用导致整个系统崩溃。 但是缓存带来了另外一些棘手的问题: 数据的一致性和实时性。 例如,数据库中的数据状态已经…

水晶报表分组分栏_web报表可视化设计器工具推荐

古往今来,信息就是决胜的关键。在科技时代的今天亦是如此。企业的数据管理在帮助企业加强管控、提高竞争力等方面具有不可或缺的作用。这就不得不说到报表工具。企业想要将储存于各种商业信息系统中的数据转化成有用的信息,最终帮助决策者做出更快、更好…

嵌套矩形——DAG上的动态规划

有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础。很多问题都可以转化为DAG上的最长路、最短路或路径计数问题。 题目描述: 有n个矩形,每个矩形可以用两个整数a,b描述,表示它的长和宽。矩形…

Twisted

Twisted定义Twisted是一个基于事件驱动的网络引擎框架网络框架,别人预先定义好的一个框架(一个项目),如.net某个web框架有25个class,从BeginRequest依次执行类里的process方法,程序员自己定义一个类&#x…

从Spring到Java EE 6

我最近在一个非常复杂的项目中工作,其中融合了许多Java EE 6技术(例如JPA,JAXB,JMS,JTA,JAX-RS等)。 出于生产力和计划方面的原因,将原型应用程序设计为独立的纯Spring应用程序。 当…

Centos 6.5 搭建php环境(nginx+mariadb+php7)

1.mariaDb vim /etc/yum.repos.d/MariaDB.repo [mariadb] name MariaDB baseurl http://yum.mariadb.org/5.5/centos5-x86 gpgkeyhttps://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck1#如果服务器已经安装了MariaDB-Galera-server包,你可能需要在安装MariaDB-s…

MAC itunes无法验证服务器s.mzstatic/itunes无法更新服务器解决方案

打开host文件: 一、用终端打开: sudo vi /etc/hosts 输入完这行命令后需要输入电脑密码,然后确认,进入host文件 然后按i键进入编辑模式,在最后一行添加:23.214.233.166 s.mzstatic.com 如下图 添加完后&…

硬币问题——固定终点的最长路和最短路

问题描述&#xff1a; 有n种硬币&#xff0c;面值分别为V1,V2...,Vn,每种都有无限多。给定非负整数S&#xff0c;可以选用多少个硬币&#xff0c;使得面值之和恰好为S&#xff1f;输出硬币数目的最小值和最大值。0 < n < 100, 0 < S < 10000, 1 < Vi < S。 …

读取nas_NAS怎么玩?除了存放小姐姐,它竟然还有这些功能

自从有了电脑&#xff0c;就一直在折腾"存储那点事儿"&#xff0c;说到底&#xff0c;电脑的本质就是存储&#xff0c;而自己弄家用存储方面的东西算下来也有几年了。单机的硬盘存储比较简单&#xff0c;但是随着家里各种设备的增多&#xff0c;各个设备间的文件共享…