操作系统原理 进程通信共享内存

合集下载

进程通信的几种方法

进程通信的几种方法

进程通信的几种方法进程通信是指在操作系统中,不同的进程之间进行数据交换和信息传递的过程。

在现代操作系统中,进程通信是非常重要的,因为多个进程之间的协作可以提高系统的性能和效率。

本文将介绍几种常见的进程通信方法。

1.管道通信管道通信是一种单向、半双工的通信方式,通过创建一个管道,将一个进程的输出连接到另一个进程的输入,从而实现数据的传输。

管道通信一般用于具有父子关系的进程之间或者具有共同祖先的进程之间。

2.消息队列通信消息队列通信是一种通过操作系统内核来传递消息的机制。

进程可以将消息发送到消息队列,其他进程则可以从消息队列中接收消息。

消息队列通信具有高效、可靠、灵活等特点,常用于进程之间传递数据量较大的情况。

3.共享内存通信共享内存通信是一种进程间共享内存区域的方式。

多个进程可以访问同一块内存区域,从而实现数据的共享。

共享内存通信的优点是速度快,因为进程之间不需要进行数据的复制,但是需要进程之间进行同步和互斥操作,以避免数据的冲突。

4.信号量通信信号量通信是一种通过操作系统提供的信号量机制来实现进程间同步和互斥的方式。

进程可以通过信号量来进行互斥操作,以确保共享资源的安全访问。

信号量通信常用于进程之间共享资源的管理和同步。

5.套接字通信套接字通信是一种通过网络进行进程通信的方式,常用于不同主机之间的进程通信。

套接字通信可以通过TCP或UDP协议来实现,具有跨平台、可靠性高等特点。

总结起来,进程通信是操作系统中非常重要的一部分,不同的进程之间可以通过各种方式进行数据的交换和信息的传递。

管道通信、消息队列通信、共享内存通信、信号量通信和套接字通信是常见的几种进程通信方法。

不同的通信方法适用于不同的场景,开发人员需要根据具体需求选择合适的通信方式。

进程通信的正确使用可以提高系统的性能和效率,确保系统的稳定运行。

操作系统原理总结

操作系统原理总结

操作系统原理总结操作系统是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石。

它负责控制和协调计算机的各种活动,使得计算机能够高效、稳定地运行。

下面就让我们来深入了解一下操作系统的原理。

操作系统的主要功能包括处理机管理、存储器管理、设备管理、文件管理和用户接口。

处理机管理的任务是合理地分配和调度处理机资源,以提高处理机的利用率和系统的性能。

进程是处理机管理中的一个重要概念,它是程序的一次执行过程。

操作系统通过进程控制、进程同步、进程通信和进程调度等手段来管理进程。

进程调度算法决定了哪个进程将获得处理机资源,常见的调度算法有先来先服务、短作业优先、时间片轮转等。

存储器管理的目标是为程序的运行提供良好的内存环境,提高内存的利用率。

内存分配方式有连续分配和离散分配两种。

连续分配包括单一连续分配和分区分配,离散分配则包括分页存储管理、分段存储管理和段页式存储管理。

虚拟存储器技术通过将部分程序和数据暂时存放在外存上,使得计算机能够运行比实际内存更大的程序。

设备管理的主要任务是管理和控制各类 I/O 设备,方便用户使用设备,并提高设备的利用率。

设备管理包括设备分配、设备驱动、设备缓冲和设备独立性等方面。

设备分配算法要考虑设备的使用情况和请求的优先级。

设备驱动程序是操作系统与设备硬件之间的接口,负责控制设备的操作。

设备缓冲可以减少 I/O 操作的次数,提高系统的性能。

文件管理负责对文件进行组织、存储、检索和保护。

文件系统为用户提供了一种按名存取的方式,方便用户对文件进行操作。

文件的逻辑结构有流式文件和记录式文件,物理结构有连续文件、链接文件和索引文件。

文件存储空间的管理方法有空闲表法、空闲链表法和位示图法等。

文件的保护机制可以防止文件被非法访问和修改。

用户接口是操作系统与用户之间的交互界面,分为命令接口和程序接口。

命令接口包括联机命令接口和脱机命令接口,程序接口则通过系统调用为用户程序提供服务。

操作系统的体系结构主要有单体结构、层次结构、微内核结构和客户/服务器结构等。

进程间通信的几种方法

进程间通信的几种方法

进程间通信的几种方法进程间通信是计算机系统中一种非常常见的需求,它允许多个进程在不同的地址空间中共享资源,实现信息的共享以及通信。

在计算机系统中,进程间通信的方法会根据使用的网络类型以及网络的连接有所不同。

对于进程间通信的方法,一般可以分为以下几种:(一)共享内存共享内存是一种最简单的进程间通信的方式,也是当今使用最为普遍的进程间通信方法。

在此方法中,多个进程可以访问共享内存区域,这样它们就可以直接在内存中进行通信,而且支持多个进程同时读取和写入内存中的数据,能满足多样化的通信需求,从而提高了系统的效率。

但是,由于这种方法不能实现两个进程之间的“双向”通信,因此它只能适用于一些特定的应用场景,而不能满足一般的进程间通信需求。

(二)消息传递消息传递是进程之间通信的常见方法,它允许两个进程之间进行双向通信,同时还能可靠地传输数据。

在消息传递中,多个进程可以通过将自己的传输内容发送到指定的消息服务器来实现进程间通信。

消息服务器会将这些内容发送到另一个进程,以便双方进行通信。

简单的消息传递本质上是一种客户端/服务器架构,而处理多个进程之间的通信时,可以使用一种名为“发布/订阅”的模型。

在这种模型中,发送者会将消息(即发布)发布到消息服务器上,而接收者(即订阅)可以订阅消息服务器上的那些发布消息。

(三)管道(PIPES)管道是另一种常用的进程间通信模式,它可以实现进程间的双向通信。

在管道模式中,多个进程共享一个双向管道,它们可以在这个双向管道上进行双向通信,也就是说,管道的一端可以用来发送数据,另一端可以用来接收数据。

与消息传递不同,管道不需要使用额外的服务器,因此它可以更快地传输数据,但是它也有很大的局限性,无法跨越网络,仅限于同一台机器上的多个进程之间的通信。

(四)信号量信号量是一种重要的进程间通信机制,它可以用来实现同步和互斥操作,使多个进程都能够按照规定的方式来完成工作,从而实现协作和通信。

信号量原理是通过一个数值来控制多个进程对共享资源的访问,当这个数值为正时,它允许多个进程访问共享资源,当这个数值为0时,它就不允许多个进程访问共享资源。

进程间的八种通信方式----共享内存是最快的IPC方式

进程间的八种通信方式----共享内存是最快的IPC方式

进程间的⼋种通信⽅式----共享内存是最快的IPC⽅式
1.⽆名管道( pipe ):管道是⼀种半双⼯的通信⽅式,数据只能单向流动,⽽且只能在具有亲缘关系的进程间使⽤。

进程的亲缘关系通常是指⽗⼦进程关系。

2.⾼级管道(popen):将另⼀个程序当做⼀个新的进程在当前程序进程中启动,则它算是当前程序的⼦进程,这种⽅式我们成为⾼级管道⽅式。

3.有名管道 (named pipe) :有名管道也是半双⼯的通信⽅式,但是它允许⽆亲缘关系进程间的通信。

4.消息队列( message queue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。

消息队列克服了信号传递信息少、管道只能承载⽆格式字节流以及缓冲区⼤⼩受限等缺点。

5.信号量( semophore ) :信号量是⼀个计数器,可以⽤来控制多个进程对共享资源的访问。

它常作为⼀种锁机制,防⽌某进程正在访问共享资源时,其他进程也访问该资源。

因此,主要作为进程间以及同⼀进程内不同线程之间的同步⼿段。

6.信号 ( sinal ) :信号是⼀种⽐较复杂的通信⽅式,⽤于通知接收进程某个事件已经发⽣。

7.共享内存( shared memory ) :共享内存就是映射⼀段能被其他进程所访问的内存,这段共享内存由⼀个进程创建,但多个进程都可以访问。

共享内存是最快的 IPC ⽅式,它是针对其他进程间通信⽅式运⾏效率低⽽专门设计的。

它往往与其他通信机制,如信号两,配合使⽤,来实现进程间的同步和通信。

8.套接字( socket ) :套解字也是⼀种进程间通信机制,与其他通信机制不同的是,它可⽤于不同机器间的进程通信。

消息队列和共享内存的进程通信机制

消息队列和共享内存的进程通信机制

消息队列和共享内存的进程通信机制
进程间通信是操作系统中非常重要的一部分,因为不同的进程可能需要相互交流信息,共同完成某项任务。

在进程间通信的机制中,消息队列和共享内存是两种常见的方式。

消息队列是一种进程间通信的方式,它是一种先进先出的数据结构,可以用来存储不同进程之间传递的消息。

消息队列有一个消息缓冲区,不同的进程可以向缓冲区中发送消息,并从中接收消息。

发送消息时需要指定消息类型,接收消息时可以选择接收指定类型的消息或者接收所有类型的消息。

共享内存是另一种进程间通信的方式,它是一种可以被多个进程访问的内存区域。

多个进程可以在共享内存中读取和写入数据,这样就可以实现进程间的数据共享和交流。

共享内存的使用需要注意进程同步和互斥的问题,否则可能会导致数据不一致或者错误。

消息队列和共享内存都是进程间通信的有效方式,但是它们各自有自己的优点和缺点。

消息队列适用于进程之间需要传递一些简单的消息,而共享内存适用于需要共享一些复杂的数据结构和大量数据的情况。

选择合适的通信机制可以提高程序的效率和可靠性。

- 1 -。

共享内存在Java中的实现和应用

共享内存在Java中的实现和应用

共享内存在Java中的实现和应用共享内存是一种用于进程间通信的机制,它允许多个进程共享同一块内存区域。

在Java中,共享内存主要通过以下几种方式实现和应用:Java内存映射、并发集合类、Java共享数据模型和进程间通信。

首先,Java内存映射是Java提供的一种共享内存的机制。

通过Java 的NIO(New Input/Output)库中的MappedByteBuffer类,我们可以将文件或内存映射到内存中,并通过同一个文件或内存来实现进程之间的通信。

这种方式可以提高进程间通信的效率,并且方便地处理大量数据。

例如,一些进程可以将数据写入共享内存,而其他进程可以直接从共享内存中读取数据,避免了不必要的数据拷贝和通信开销。

其次,Java提供了一系列的并发集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等,它们内部使用了共享内存实现多线程之间的安全访问。

这些集合类通过使用非阻塞算法和锁分离等技术,实现了高效地共享内存访问。

这样,多个线程可以同时读写共享内存,而无需显式地进行同步操作。

这种方式在并发编程中得到广泛应用,例如多线程的生产者-消费者模型、线程池等场景。

此外,Java还提供了一种共享数据模型,即Java内存模型(Java Memory Model,JMM)。

JMM定义了多线程之间如何共享数据的规范,通过使用volatile、synchronized等关键字来保证共享内存的可见性和一致性。

JMM提供了一种方便的方式来实现多线程之间的共享数据访问,使得开发者可以更容易地编写并发程序。

例如,多个线程可以通过共享变量来进行状态同步、线程间的通信等操作。

最后,Java中的进程间通信也可以使用共享内存来实现。

通过操作系统的底层API,Java可以创建共享内存区域,并在不同的进程之间共享该内存区域。

例如,Java提供了一种称为JNI(Java Native Interface)的机制,允许Java程序通过调用本地代码来访问操作系统的底层功能。

CC++进程间通信内存共享

CC++进程间通信内存共享

CC++进程间通信内存共享介绍内存共享前,说下之前的误区,觉得,可以⽤指针来在⽗⼦进程中传递数据,其实,在fork()后,⽗⼦进程的地址空间是相互独⽴的!所以在⽗⼦进程间传递指针是没有意义的。

这⾥就涉及到物理地址和逻辑地址(或称虚拟地址)的概念。

从逻辑地址到物理地址的映射称为地址重定向。

分为:静态重定向--在程序装⼊主存时已经完成了逻辑地址到物理地址和变换,在程序执⾏期间不会再发⽣改变。

动态重定向--程序执⾏期间完成,其实现依赖于硬件地址变换机构,如基址寄存器。

逻辑地址:CPU所⽣成的地址。

CPU产⽣的逻辑地址被分为 :p (页号)它包含每个页在物理内存中的基址,⽤来作为页表的索引;d (页偏移),同基址相结合,⽤来确定送⼊内存设备的物理内存地址。

物理地址:内存单元所看到的地址。

⽤户程序看不见真正的物理地址。

⽤户只⽣成逻辑地址,且认为进程的地址空间为0到max。

物理地址范围从R+0到R+max,R为基地址,地址映射-将程序地址空间中使⽤的逻辑地址变换成内存中的物理地址的过程。

由内存管理单元(MMU)来完成。

fork()会产⽣⼀个和⽗进程完全相同的⼦进程,但⼦进程在此后多会exec系统调⽤,出于效率考虑,linux中引⼊了“写时复制“技术,也就是只有进程空间的各段的内容要发⽣变化时,才会将⽗进程的内容复制⼀份给⼦进程。

在fork之后exec之前两个进程⽤的是相同的物理空间(内存区),⼦进程的代码段、数据段、堆栈都是指向⽗进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同⼀个。

当⽗⼦进程中有更改相应段的⾏为发⽣时,再为⼦进程相应的段分配物理空间,如果不是因为exec,内核会给⼦进程的数据段、堆栈段分配相应的物理空间(⾄此两者有各⾃的进程空间,互不影响),⽽代码段继续共享⽗进程的物理空间(两者的代码完全相同)。

⽽如果是因为exec,由于两者执⾏的代码不同,⼦进程的代码段也会分配单独的物理空间。

操作系统的消息传递和进程间通信实现进程间的信息传递和通信

操作系统的消息传递和进程间通信实现进程间的信息传递和通信

操作系统的消息传递和进程间通信实现进程间的信息传递和通信操作系统是计算机中非常重要的一个组成部分,它负责管理和控制计算机的硬件和软件资源。

在多道程序设计环境下,操作系统需要负责调度和管理多个进程的执行。

而进程间的信息传递和通信是操作系统中一个关键的功能,它使得不同进程之间能够相互交互、传递数据,从而实现协同工作和资源共享。

本文将探讨操作系统中的消息传递和进程间通信,以及它们的实现方法和技术。

一、消息传递在操作系统中,进程间的信息传递可以通过消息传递的方式来实现。

消息传递是指一个进程向另一个进程发送消息,并由接收进程接收和处理该消息。

消息传递可以用于进程间的同步和通信,从而实现进程之间的交互。

消息传递一般包括以下几个步骤:1. 消息的创建:发送进程首先需要创建一条消息,并在消息中填写相应的内容。

消息可以包含数据、指令等信息,以满足不同的需求。

2. 消息的发送:发送进程将创建好的消息发送给接收进程。

发送进程需要指定接收进程的标识符,以确保消息能够被正确地发送到目标进程。

3. 消息的接收:接收进程通过等待操作等待消息的到达。

当消息到达时,接收进程将检查消息的标识符,以确定该消息是否是自己所期望接收的。

4. 消息的处理:接收进程接收到消息后,会对消息进行处理。

处理的方式取决于消息的内容和接收进程的需求。

消息传递可以有两种方式:直接消息传递和间接消息传递。

直接消息传递是指发送进程直接发送消息给接收进程。

间接消息传递是指通过操作系统的消息队列来传递消息。

不同的方式适用于不同的场景和需求。

二、进程间通信的实现为了实现进程间的信息传递和通信,操作系统提供了多种机制和技术。

以下是几种常见的进程间通信的实现方式:1. 共享内存共享内存是一种在多个进程之间共享同一块物理内存的方式。

通过将一块内存区域映射到多个进程的地址空间中,进程可以通过读写共享内存的方式来进行通信。

共享内存的优点是速度快,但需要进程之间进行同步和互斥操作,以避免数据的冲突和错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程实践报告书课程名称:操作系统原理题目:进程通信-共享内存学生姓名:专业:计算机科学与技术(网络方向)班别:计科本113班学号:1104402308指导老师:日期:2013 年06 月25 日目录一、基本要求 (2)二、流程图分析 (3)三、共享内存描述和使用 (10)3.1共享内存的概述 (10)3.2共享内存的原理 (11)3.3共享内存的分配 (12)3.4 共享内存的访问 (13)3.5共享内存的应用 (13)3.6共享内存的意义 (14)四、实验构思 (14)4.1 main()的使用 (14)4.2 shmget()调用 (16)4.3 fork()的调用 (16)4.4 子进程调用shmat() (17)4.5子进程调用shmdt() (17)4.6 父进程调用 shmctl() (17)4.7父进程调用shmat(),shmdt(),shmctl() (18)五、实验的调试与测试 (18)六、实验结果 (20)七、源程序 (21)八、实验感受 (23)九、参考文献 (24)一、基本要求1.1实验题目:进程通信共享内存1.2实践目的:用代码实现进程通信共享内存1.3实践内容:用C语言代码创建进程,实现进程通信共享内存(父进程和子进程通过共享内存实现信息的交流)1.4实验环境:linux操作系统及gcc工具二、流程图分析图1-1如图1-1首先父进程调用shmget()函数建立一个共享内存,该函数返回一内存的标识符。

图1-2如图1-2父进程调用fork()产生一个子进程图1-3如图1-3子进程调用shmat()函数将该共享内存连接到自己的虚存空间中图1-4如图1-4写完数据后,子进程调用shmdt()函数断开与该进程的连接如图1-5如图1-5父进程调用shmctl()函数得到关于这块共享内存的相关信息,并打印出来图1-6如图1-6父进程调用shmat()函数将这块共享内存连接到自己的虚存空间图1-7如图1-8父进程调用shmdt()函数断开与该共享内存的连接图1-8如图1-8父进程调用shmctl()函数,销毁该共享进程。

三、共享内存描述和使用3.1共享内存的概述针对消息缓冲需要占用CPU进行消息复制的缺点,操作系统提供了一种进程间直接进行数据交换的通信方式——共享内存。

顾名思义,这种通信方式允许多个进程共享同一块物理内存空间来实现进程之间的信息交换,其特点是没有中间环节,直接将共享的内存页面通过附接,映射到相互通信的进程各自的虚拟地址空间中,从而使多个进程可以直接访问同一个物理内存页面,如同访问自己的私有空间一样(但实质上不是私有的而是共享的)。

因此这种进程间通信方式是在同一个计算机系统中的诸进程间实现通信的最快捷的方法,而它的局限性也在于此,即共享内存的诸进程必须共处同一个计算机系统,有物理内存可以共享才行。

3.2共享内存的原理共享内存是由IPC为一个进程所创建并且出现在这个进程的地址空间中的一段特殊的地址序列。

其他的进程可以将同样的共享内存段关联到他们自己的地址空间中。

所有的进程都可以访问这段内存地址,就如同这段内存是由malloc所分配的。

如果一个进程写入共享内存,这些改变立即就可以为访问相同共享内存的其他进程所见。

就其自身而言,共享内存并没有提供任何共享方法。

并没有自动的方法来阻止在第一个进程完成写入共享内存之前第二个进程开始读取共享内存。

3.3共享内存的分配要使用一块共享内存,进程必须首先分配它。

随后需要访问这个进程释放该共享内存块。

尽管每个进程都有自己的内存地址,不同的进程可以同时将同一个内存页面映射到自己的地址空间中,从而达到共享内存的目的。

分配一个新的共享内存块会创建新的内存页面。

因为所有进程都希望共享对同一块内存的访问,只应由一个进程创建一块新的共享内存。

再次分配一块已经存在的内存块不会创建新的页面,而只是会返回一个标识该内存块的标识符。

一个进程如需使用这个共享内存块,则首先需要将它绑定到自己的地址空间中。

这样会创建一个从进程本身虚拟地址到共享页面的映射关系。

当对共享内存的使用结束之后,这个映射关系将被删除。

当再也没有进程需要使用这个共享内存块的时候,必须有一个(且只能是一个)进程负责释放这个被共享的内存页面。

所有共享内存块的大小都必须是系统页面大小的整数倍。

系统页面大小指的是系统中单个内存页面包含的字节数。

进程通过调用shmget来分配一个共享内存块。

该函数的第二个参数指定了所申请的内存块的大小。

因为这些内存块是以页面为单位进行分配的,实际分配的内存块大小将被扩大到页面大小的整数倍。

3.4 共享内存的访问要让一个进程获取对一块共享内存的访问,这个进程必须先调用shmat(SHared Memory Attach,绑定到共享内存)。

将 shmget 返用于映射。

3.5共享内存的应用共享内存的通信方式是通过将可以共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的,因此,这些进程之间的读写操作的同步问题操作系统无法实现,必须由诸共享该内存的进程去控制。

另外,由于内存实体存在于计算机系统中,所以只能由处于同一个计算机系统中的诸进程共享。

以上两点是共享内存通信的缺点,但是它提供了诸进程直接读写信息,无须复制,因而方便快捷的进程间通信方式,适用于信息量大且操作频繁的场合。

3.6共享内存的意义或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回内容的时候,其它进程都会察觉到这个更改。

所有进程共享同一块内存,共享内存在各种进程间通信方式中具有最高的效率。

访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其它需要切入内核的过程来完成。

同时它也避免了对数据的各种不必要的复制。

四、实验构思4.1 main()的使用int main(){int shmid;char *shmaddr;strut shmid_ds buf;shmid=shmget(KEY,SIZE,IPC_CREAT | 0600);if(shmid==-1){printf("create share memory failed:%s",strerror(errno));return 0;}if(fork()==0){sleep(2);shmaddr=(char *)shmat(shmid,NULL,0);if(shmaddr==(void*)-1){printf("connect to the share memory failed:%s",strerror(errno));return 0;}strcpy(shmaddr,"hello,this is shared data.\n");shmdt(shmaddr);exit(0);}else{wait(0);shmctl(shmid,IPC_STAT,&buf);printf("size of the share memory:shm_segsz=%dbytes\n",buf.shm_segsz);printf("process id of the last operator:shm_lpid=%d\n",buf.shm_cpid);printf("process id of the last operator:shm_lpid+%d\n",buf.shm_lpid);shmaddr=(char *)shmat(shmid,NULL,0);if(shmaddr==(void *)-1){printf("connectthe share memoryfailed:%s",strerror(errno));return 0;}printf("print the content of the share memory:");printf("%s\n",shmaddr);shmdt(shmaddr);shmctl(shmid,IPC_RMID,NULL);}}4.2 shmget()调用首先调用shmget()函数建立一块共享内存,大小为1024个字节,shmid=shmget(KEY,SIZE,IPC_CREAT | 0600)建立共享内存,此函数调用用于创建一个新的共享内存段或存取一个已存在的共享内存段。

函数调用成功返回共享内存段的标识符,否则返回一1值。

s h mg e t的内部实现包含了许多重要的S y s t e m V共享内存机制;s h ma t 在把共享内存区域映射到进程空间时,并不真正改变进程的页表。

当进程第一次访问内存映射区域访问时,会因为没有物理页表的分配而导致一个缺页异常,然后内核再根据相应的存储管理机制为共享内存映射区域分配相应的页表。

4.3 fork()的调用调用fork()产生一个子进程(生产者进程)。

子进程调用shmat()函数将该共享内存连接(attach)到自己的虚存空间,即可通过普通的内存写操作(例如strcpy等),在该共享内存写入数据。

4.4 子进程调用shmat()shmaddr=(char *)shmat(shmid,NULL,0) 系统自动选择一个地址连接,s h ma t ( ) 可以创建一个共享内存区,或者获得已创建的共享内存区的标识符后,将共享内存段映射到进程的内存空间。

返回共享内存段的地址,否则返回一1值。

4.5子进程调用shmdt()写完数据生,子进程调用shmdt(shmaddr)断开共享,此函数调用可以将映射到进程的共享内存段撤消。

函数调用成功返回0值,否则返回一1 。

一个共享内存与一个进程分离时.共享内存段的s h m a r r a y结构中的共享计数减1 ,直至计数为0 ,系统才真正删除这个共亨内存页面。

4.6 父进程调用 shmctl()父进程sleep,直到子进程完成上述操作。

shmctl(shmid,IPC_RMID,NULL)取得共享内存的相关信息,并打印出来s h mct l 可以用来查询一些共享内存的使用情况和进行一些控制操作。

函数调用成功后返回0值,否则返回一1 值。

比如:s h mc t l ( s h m i d ,I P C RMI D,0 ) 将删除s h m i d指示的共享内存。

4.7父进程调用shmat(),shmdt(),shmctl()父进程调用shmat()函数将这块共享内存连接到自己的虚存空间,即可通过普通的内存读操作(例如printft等),将该共享内存中的字符串读出来。

读完数据后,父进程调用shmctl()函数,销毁断开与该共享内存的连接。

相关文档
最新文档