热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UNIX:高级环境编程第十五章IPC:进程间通信

IPC(InterProcessCommunication)进程间通信.为啥没有进程间通信,这是因为进程间都是同步的关系,不需要通信.1.管道1.1管道特点:(1)半双工的(即数据

  IPC(InterProcess Communication)进程间通信.为啥没有进程间通信,这是因为进程间都是同步的关系,不需要通信.

1.管道

1.1管道特点:

  (1)半双工的(即数据只能在一个方向上流动),某些系统提供全双工的管道.

  (2)管道只能在具有公共祖先的两个进程之间使用.通常,一个管道由一个进程创建,在进程调用fork后,这个管道就能在父子进程之间通信了.

1.2使用:

  (1)在管道中键入一条命令,让shell执行,shell会为每一条命令单独创建一个进程,然后用管道将浅一条命令进程的标准输出与后一条命令的标准输入链接.  

  (2)管道通过调用pipe函数来创建:

#include
int pipe(int fd[2]);

#include "apue.h"int
main(
void)
{
int n;int fd[2];pid_t pid;char line[MAXLINE];if (pipe(fd) <0)err_sys("pipe error");if ((pid &#61; fork()) <0){err_sys("fork error");}else if(pid > 0){ /* parent */close(fd[0]);write(fd[1], "hello son, this is from your dad\n", 33);}else{ /* child */close(fd[1]);n &#61; read(fd[0], line, MAXLINE);write(STDOUT_FILENO, line, n);}exit(0);
}

1.3原理:

  首先父进程创建一个父进程到父进程的管道,然后fork得到子进程,子进程同样得到了父进程的管道.然后父进程关闭读端,子进程关闭写端.从而得到了一条父进程写 子进程读的管道.

1.4 popen和pclose:

  常见的操作是创建一个链接到另一个进程的管道,然后读其输出或向其输入端发送数据,为此,标准I/O库提供了两个函数popen和pclose来实现这样的操作:创建一个管道,fork一个子进程,关闭未使用的管道端,执行一个shell运行命令,然后等待命令终止.

 

2.FIFO

  FIFO有时被称为命名管道.未命名的管道只能在两个相关的进程之间使用,而且这两个相关进程还要有一个共同的创建他们的祖先.

但是FIFO,不相关的进程也可以交换数据.

  FIFO是一种文件类型.创建FIFO类似于创建一个文件.

2.1用途:

  (1)shell命令使用FIFO将数据从一条管道传送到另一条时,无需创建中间文件;

    用FIFO复制输出流

  (2)客户进程-服务器进程应用程序中,FIFO用作汇聚点,在客户进程和服务器进程二者之间传递数据.

    使用FIFO进行客户进程-服务器进程通信

 

XSI IPC(消息队列\信号量或者共享存储器)

  标识符和键:

    每个内核中的IPC结构(消息队列\信号量或者共享存储器)都用一个非负整数的标识符加以引用.

    每个IPC对象都与一个键(key)相关联,将这个键作为该对象的外部名.

  权限结构:

 

3 消息队列

  消息队列是消息的链接表,存储在内核中,由消息队列标识符标识.与命名管道一样,消息队列可以在不相关进程之间进行通信.二者都是通过发送和接收的方式来传递数据的.

  在命名管道中  发送数据write    接收数据read  

  在消息队列中  发送数据msgsnd    接收数据msgrcv

  他们对每个数据都有一个最大长度的限制.

 

4 信号量

  信号量是一个计数器,他与IPC机构(管道 FIFO 消息队列)不同.

  信号量主要用来为多个进程提供对共享数据对象的访问.

  为了获得共享资源,进程需要执行下列操作:

  (1)测试控制该资源的信号量.

  (2)若此信号量的值未正,则进程可以是使用该共享资源.在这种情况下,进程会将信号量-1,表示它使用了一个资源单位.

  (3)否则,若信号量&#61;0,则进程进入休眠状态,直至信号量>0

  信号量值的测试以及减1操作应该是原子操作.

4.1分类:

  (1)内核信号量, 由内核控制路径使用

  (2)用户态进程使用的信号量,又分POSIX信号量和SYSTEM V信号量。

      POSIX信号量又分为有名信号量和无名信号量。
        有名信号量&#xff0c;其值保存在文件中, 所以它可以用于线程也可以用于进程间的同步。

        无名信号量&#xff0c;其值保存在内存中。

信号量 记录锁和互斥量的时间比较:  

  如果在多个进程间共享一个资源,可以使用这3种技术中的一种来协调访问.

 

5 共享存储:

  共享存储允许两个或以多个进程共享一个给定的存储区.(同一逻辑内存)因为数据不需要在客户进程和服务器进程之间复制,所以是最快的一种IPC.

  有一个数据同步的问题,就是在服务端在向内存里面写数据完成之前,不应当又客户端取数据,通常,信号量用于同步共享存储访问.(也可以使用 记录锁 或 互斥量)

  

转:https://www.cnblogs.com/luntai/p/6233659.html



推荐阅读
  • 题面传送门Solution看到什么最大值最小肯定二分啊。check直接跑一个二分图匹配就好了。orzztl!!!代码实现*mail:mle ... [详细]
  • P113:集成日志组件 logback 2彩色日志
    第二步,将控制台的日志改成彩色日志,便于查看修改logback.xml文件。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • vue使用
    关键词: ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 题目描述Takuru是一名情报强者,所以他想利用他强大的情报搜集能力来当中间商赚差价。Takuru的计划是让Hinae帮他去市场上买一个商品,然后再以另一个价格卖掉它。Takur ... [详细]
  • DescriptionclickmeSolution套路的状压期望DP题。。。考虑倒退期望:设fi,jrolepresentationstyleposi ... [详细]
  • JZOJ 1266. 玉米田
    1266.玉米田(cowfood.pasccpp)(FileIO):input:cowfood.inoutput:cowfood.outTimeLimits:1000msMemor ... [详细]
  •   并查集是一种群众喜闻乐见的数据结构,其复杂度是数据结构中最奇葩的之一了,Tarjan证明其为阿克曼函数的反函数,在可以想象(不全面的解释啊)的范围内小于等于3。。。我们就把它当做O(1)吧。下面通 ... [详细]
  • 为什么即使Linux服务器的socket关闭,客户端仍能调用一次send函数?
    要弄清这个问题,首先需要知道调用send()发送数据时,发生了什么。当调用send()发送数据时,并不是直接将数据发送到网络中,而是先将待发送的数据放到socket发送缓冲区中,然 ... [详细]
author-avatar
辽宁何氏医学院高明月
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有