进程间通讯机制
进程间通信机制IPC

进程间通信机制IPC进程通信是指进程之间的信息交换。
PV操作是低级通信⽅式,例如信号量,主要是进程间以及同⼀进程内不同线程之间的同步⼿段。
髙级通信⽅式是指以较⾼的效率传输⼤量数据的通信⽅式。
⾼级通信⽅法主要有以下三个类。
共享存储在通信的进程之间存在⼀块可直接访问的共享空间,通过对这⽚共享空间进⾏写/读操作实现进程之间的信息交换。
在对共享空间进⾏写/读操作时,需要使⽤同步互斥⼯具(如 P操作、V操作),对共享空间的写/读进⾏控制。
共享存储⼜分为两种:低级⽅式的共享是基于数据结构的共享;⾼级⽅式则是基于存储区的共享。
操作系统只负责为通信进程提供可共享使⽤的存储空间和同步互斥⼯具,⽽数据交换则由⽤户⾃⼰安排读/写指令完成。
需要注意的是,⽤户进程空间⼀般都是独⽴的,要想让两个⽤户进程共享空间必须通过特殊的系统调⽤实现,⽽进程内的线程是⾃然共享进程空间的。
共享存储是最快的可⽤IPC,是针对其他通信机制运⾏效率较低⽽设计的。
消息传递在消息传递系统中,进程间的数据交换是以格式化的消息(Message)为单位的。
若通信的进程之间不存在可直接访问的共享空间,则必须利⽤操作系统提供的消息传递⽅法实现进程通信。
进程通过系统提供的发送消息和接收消息两个原语进⾏数据交换。
1) 直接通信⽅式:发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。
2) 间接通信⽅式:发送进程把消息发送到某个中间实体中,接收进程从中间实体中取得消息。
这种中间实体⼀般称为信箱,这种通信⽅式⼜称为信箱通信⽅式。
该通信⽅式⼴泛应⽤于计算机⽹络中,相应的通信系统称为电⼦邮件系统。
消息传递克服了信号承载信息少,管道只能承载⽆格式字节流以及缓冲区⼤⼩受限制等缺点。
管道通信管道通信是消息传递的⼀种特殊⽅式。
所谓“管道”,是指⽤于连接⼀个读进程和⼀个写进程以实现它们之间通信的⼀个共享⽂件,⼜名pipe ⽂件。
system v进程间通信原理 -回复

system v进程间通信原理-回复System V进程间通信原理进程间通信是操作系统中非常重要的一部分,它允许不同的进程之间进行数据的交换和共享。
其中,System V进程间通信(IPC)是一种经典的进程间通信机制,在早期的Unix系统中被广泛应用。
本文将详细阐述System V进程间通信的原理,包括其基本概念、原理工作流程以及常用的通信方式。
一、基本概念1. 进程在操作系统中,进程是执行中的程序的实例。
它包含了用于执行程序的代码、数据和资源等。
2. 进程间通信进程间通信是指两个或多个进程之间传输数据或共享资源的机制。
它可以分为进程间消息传递和进程间共享内存两种方式。
3. System V进程间通信System V进程间通信是Unix系统提供的一种进程间通信机制,它使用了一些基本的系统调用函数来实现进程间的数据交换和共享。
二、原理工作流程System V进程间通信的基本原理是通过共享的系统资源来实现进程间的数据传输和共享。
为了实现这一机制,System V IPC 提供了三种常见的通信方式,包括信号量、共享内存和消息队列。
1. 信号量信号量是System V IPC 中最简单的通信方式之一,它允许多个进程共享一个整型变量,用于同步和互斥访问共享资源。
在信号量机制中,每个进程在访问共享资源前需要先检查信号量的值,并将其减少一个单位。
当信号量为0时,表示资源已经被其他进程占用,当前进程需要等待。
当某个进程使用完资源后,需要将信号量值增加一个单位,以允许其他进程继续使用。
2. 共享内存共享内存是System V IPC 中实现进程间数据共享最常用的方式之一。
它允许多个进程访问同一片物理内存,以实现数据的共享和传递。
在共享内存机制中,首先需要使用`shmget`系统调用函数创建一个共享内存区域,并获得其唯一的标识符。
之后,各个进程可以通过`shmat`函数将该共享内存区域附加到自己的地址空间,并使用该地址进行数据的读写。
ipc的工作原理

ipc的工作原理
IPC(Inter-Process Communication,进程间通信)是一种让不
同进程之间相互交换数据和信息的机制。
它可以在操作系统的保护机制下,确保多个进程能够安全地共享资源和进行协作。
IPC的工作原理包括以下几个方面。
首先,IPC采用了共享内存、消息传递和远程过程调用等技术
实现进程间通信。
其中,共享内存是指多个进程可以访问同一个物理内存区域,从而实现数据共享;消息传递是指通过传递消息的方式实现进程之间的通信;远程过程调用是指一个进程可以调用另一个进程的函数或方法。
其次,IPC需要操作系统提供相应的系统调用或库函数来支持。
这些系统调用或库函数可以帮助进程创建共享内存区域、发送和接收消息、建立网络连接等。
通过这些函数,进程可以向操作系统发出请求,并且得到相应的反馈结果。
另外,IPC还需要用到一些同步和通信机制来确保数据的完整
性和一致性。
比如,互斥量和信号量可以用来保护共享内存区域的互斥访问;条件变量可以用来在进程之间传递同步信号;管道和套接字等可以在进程之间传递数据。
最后,IPC的具体实现方式还可以根据不同的需求选用适合的
技术。
比如,在单机环境下,可以使用共享内存和消息队列来实现进程间通信;在分布式环境下,可以使用远程过程调用和网络套接字来完成进程间的远程通信。
总之,IPC是一种重要的进程间通信机制,通过使用不同的技术和方法,可以实现进程之间的数据交换和信息共享,从而提高系统的并发性和响应性能。
ipc工作原理

ipc工作原理
IPC(Inter-Process Communication,进程间通信)是指操作系
统中用于不同进程之间进行数据交换和通信的机制。
它允许不同的进程之间共享资源、相互合作、传递数据等。
IPC的工作原理主要基于以下几个关键概念和机制:
1. 进程:指操作系统中正在运行的程序,每个进程都有独立的内存空间和执行环境。
2. 进程间通信:表示进程之间交换和共享数据的过程。
3. 通信通道:为进程提供数据交换的通道,可以是硬件设备(例如管道、消息队列等)或内核提供的软件机制(例如套接字、共享内存等)。
4. 数据传输:实际的数据交换过程,涉及数据的读写操作和两个进程的协调与同步。
具体的工作流程可以简要描述如下:
1. 创建通信通道:两个进程需要事先创建一个共享的通信通道,以便进行数据的传输和交流。
通道的创建可以通过系统调用或库函数来完成。
2. 传递数据:一方进程将要传递的数据写入到通信通道中,另一方进程则从通道中读取数据。
读写操作可以是阻塞或非阻塞的,根据实际需求进行选择。
3. 同步与协调:在数据的读写过程中,两个进程需要进行同步和协调,以保证数据传输的正确性和可靠性。
可以使用信号量、锁等机制来实现。
4. 完成通信:当数据传输完毕后,进程可以关闭通信通道,释放相关的资源。
IPC的工作原理可以根据具体的通信机制和技术实现方式进行扩展和解释。
常见的IPC技术包括管道、消息队列、共享内存、套接字等,它们各自有不同的特点和适用范围。
通过合理地选择和使用IPC技术,可以实现不同进程之间的高效通信和协作,提高系统的性能和功能。
消息队列和共享内存的进程通信机制

消息队列和共享内存的进程通信机制
进程间通信是操作系统中非常重要的一部分,因为不同的进程可能需要相互交流信息,共同完成某项任务。
在进程间通信的机制中,消息队列和共享内存是两种常见的方式。
消息队列是一种进程间通信的方式,它是一种先进先出的数据结构,可以用来存储不同进程之间传递的消息。
消息队列有一个消息缓冲区,不同的进程可以向缓冲区中发送消息,并从中接收消息。
发送消息时需要指定消息类型,接收消息时可以选择接收指定类型的消息或者接收所有类型的消息。
共享内存是另一种进程间通信的方式,它是一种可以被多个进程访问的内存区域。
多个进程可以在共享内存中读取和写入数据,这样就可以实现进程间的数据共享和交流。
共享内存的使用需要注意进程同步和互斥的问题,否则可能会导致数据不一致或者错误。
消息队列和共享内存都是进程间通信的有效方式,但是它们各自有自己的优点和缺点。
消息队列适用于进程之间需要传递一些简单的消息,而共享内存适用于需要共享一些复杂的数据结构和大量数据的情况。
选择合适的通信机制可以提高程序的效率和可靠性。
- 1 -。
Python中的进程间通信

Python中的进程间通信进程间通信(IPC,Inter-Process Communication)是一种进程之间传递数据和消息的方式。
在操作系统中,进程是程序在运行时分配给它的内存空间和系统资源的实例。
不同的进程可能运行在不同的计算机上或者同一台计算机上的不同CPU中。
进程间通信是实现多个进程相互合作完成任务的必要手段之一。
进程间通信的方式可以分为多种,包括管道、消息队列、共享内存、信号量等。
Python通过提供不同的模块实现了这些方式,使得进程可以在Python中相互通信,完成不同的任务,实现高效的协作。
1.管道(Pipe)管道是在两个进程之间建立的一条通信通道,可以进行双向通信。
通常情况下,一个进程的输出被重定向到管道中,另一个进程则从管道中读取输入。
在Python中可以使用os模块的pipe()方法来建立管道。
示例代码:```pythonimport ospipe = os.pipe()pid = os.fork()if pid == 0:#子进程从管道中读取数据os.close(pipe[1])data = os.read(pipe[0], 1024)print(f"子进程读取到的数据:{data}") os._exit(0)else:#父进程向管道中写入数据os.close(pipe[0])os.write(pipe[1], b"Hello, Pipe!")os.wait()```在上面的代码中,我们先调用了pipe()方法创建了一个管道,然后使用fork()方法创建了一个子进程。
子进程从管道中读取数据,父进程则向管道中写入数据,最终等待子进程结束。
2.消息队列(Message Queue)消息队列是一种进程间通信机制,可以在不同的进程之间传递消息。
消息队列通常是先进先出的,每个消息都有一个标识符来标记其类型。
在Python中可以使用sysv_ipc模块来使用消息队列。
ipc通信机制

ipc通信机制IPC通信机制是指进程间通信(IPC)的一种实现方式。
在计算机中,一个进程是指正在运行的程序,而IPC是指两个或多个进程之间进行通信的方式。
进程间通信机制是操作系统中的一个重要功能,可以让不同的进程之间能够进行数据交换、资源共享等操作。
本文将从IPC通信机制的基本概念、常见机制、实现方式和应用场景等方面进行详细介绍。
一、IPC通信机制的基本概念IPC通信机制是指进程之间进行通信的方式,它主要包括以下几个基本概念:1. 进程(Process):是计算机中正在运行的程序的实例,它具有独立的内存空间和执行环境。
2. 线程(Thread):是进程中的一个执行单元,它与其他线程共享进程的内存空间和执行环境。
3. 进程间通信(IPC):是指两个或多个进程之间进行通信的方式,主要包括消息队列、共享内存、管道、信号量和套接字等机制。
4. 消息队列(Message Queue):是一种进程间通信机制,它允许一个进程向另一个进程发送消息。
5. 共享内存(Shared Memory):是一种进程间通信机制,它允许多个进程共享同一块内存区域。
6. 管道(Pipe):是一种进程间通信机制,它允许一个进程向另一个进程发送数据流。
7. 信号量(Semaphore):是一种进程间通信机制,它允许多个进程访问同一资源,并保证资源的正确使用。
8. 套接字(Socket):是一种进程间通信机制,它允许不同计算机上的进程之间进行通信。
二、常见的IPC通信机制在实际应用中,常见的IPC通信机制包括消息队列、共享内存、管道、信号量和套接字等。
下面将分别介绍这五种常见的IPC通信机制:1. 消息队列消息队列是一种进程间通信机制,它允许一个进程向另一个进程发送消息。
消息队列通常由内核维护,可以用于进程之间的异步通信,也可以用于进程之间的同步通信。
消息队列的优点是可以实现进程之间的松耦合,即发送方和接收方不需要同时存在,可以先发送消息,然后等待接收方处理。
system verilog 中进程间通讯的常用机制

system verilog 中进程间通讯的常用机制SystemVerilog是一种硬件描述语言,用于设计和验证复杂的数字系统。
在SystemVerilog中,进程间通信是设计和验证中一个重要的方面。
本文将介绍SystemVerilog中进程间通信的常用机制。
一、FIFO队列FIFO(First In, First Out)队列是SystemVerilog中最常用的进程间通信机制之一。
它可以实现单个或多个生产者与单个或多个消费者之间的数据传输。
FIFO队列由一组寄存器组成,其中包含用于存储和传输数据的缓冲区。
FIFO队列通常具有读指针和写指针,用于指示下一个要读取的数据和下一个要写入的数据的位置。
当生产者向队列中写入数据时,写指针递增,当消费者从队列中读取数据时,读指针递增。
通过读取和写入指针的比较,可以确定队列是否为空或已满。
二、信号量信号量是另一种常见的进程间通信机制。
它用于控制共享资源的访问。
信号量有一个计数器,在资源被占用时递减,在资源释放时递增。
当计数器为零时,其他进程需要等待资源可用。
在SystemVerilog中,可以使用`semaphore`关键字定义信号量。
通过使用`wait()`和`signal()`方法,进程可以申请和释放信号量。
三、事件事件是SystemVerilog中用于进程同步的常见机制之一。
事件表示某个特定条件是否满足。
当事件发生时,其他进程可以通过等待该事件来进行进一步操作。
SystemVerilog中,可以使用`event`关键字定义事件。
通过使用`->`操作符,可以将事件关联到条件或表达式上。
四、互斥锁互斥锁是用于保护共享资源的进程同步机制。
只有一个进程可以获得互斥锁,并访问被保护的资源。
其他进程需要等待互斥锁被释放后才能访问资源。
在SystemVerilog中,可以使用`lock()`和`trylock()`方法获取互斥锁,并使用`unlock()`方法释放互斥锁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进程间通讯机制进程在核心的协调下进行相互间的通讯。
Linux支持大量进程间通讯(IPC)机制。
除了信号和管道外,Linux 还支持Unix系统V中的IPC机制。
信号信号是Unix系统中的最古老的进程间通讯方式。
它们用来向一个或多个进程发送异步事件信号。
信号可以从键盘中断中产生,另外进程对虚拟内存的非法存取等系统错误环境下也会有信号产生。
信号还被shell程序用来向其子进程发送任务控制命令。
系统中有一组被详细定义的信号类型,这些信号可以由核心或者系统中其它具有适当权限的进程产生。
使用kill命令(kill -l)可以列出系统中所有已经定义的信号。
在我的系统(Intel系统)上运行结果如下:1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO30) SIGPWR当我在Alpha AXP中运行此命令时,得到了不同的信号个数。
除了两个信号外,进程可以忽略这些信号中的绝大部分。
其一是引起进程终止执行的SIGSTOP信号,另一个是引起进程退出的SIGKILL信号。
至于其它信号,进程可以选择处理它们的具体方式。
进程可以阻塞信号,如若不阻塞,则可以在自行处理此信号和将其转交核心处理之间作出选择。
如果由核心来处理此信号,它将使用对应此信号的缺省处理方法。
比如当进程接收到SIGFPE(浮点数异常)时,核心的缺省操作是引起core dump和进程的退出。
信号没有固有的相对优先级。
如果在同一时刻对于一个进程产生了两个信号,则它们将可能以任意顺序到达进程并进行处理。
同时Linux并不提供处理多个相同类型信号的方式。
即进程无法区分它是收到了1个还是42个SIGCONT信号。
Linux通过存储在进程task_struct中的信息来实现信号。
信号个数受到处理器字长的限制。
32位字长的处理器最多可以有32个信号而64位处理器如Alpha AXP 可以有最多64个信号。
当前未处理的信号保存在signal域中,并带有保存在blocked中的被阻塞信号的屏蔽码。
除了SIGSTOP和SIGKILL外,所有的信号都能被阻塞。
当产生可阻塞信号时,此信号可以保持一直处于待处理状态直到阻塞释放。
Linux保存着每个进程处理每个可能信号的信息,它们保存在每个进程task_struct中的sigaction数组中。
这些信息包括进程希望处理的信号所对应的过程地址,或者指示是忽略信号还是由核心来处理它的标记。
通过系统调用,进程可以修改缺省的信号处理过程,这将改变某个信号的sigaction以及阻塞屏蔽码。
并不是系统中每个进程都可以向所有其它进程发送信号:只有核心和超级用户具有此权限。
普通进程只能向具有相同uid和gid的进程或者在同一进程组中的进程发送信号。
信号是通过设置task_struct结构中signal域里的某一位来产生的。
如果进程没有阻塞信号并且处于可中断的等待状态,则可以将其状态改成Running,同时如确认进程还处在运行队列中,就可以通过信号唤醒它。
这样系统下次发生调度时,调度管理器将选择它运行。
如果进程需要缺省的信号处理过程,则Linux可以优化对此信号的处理。
例如SIGWINCH(X窗口的焦点改变)信号,其缺省处理过程是什么也不做。
信号并非一产生就立刻交给进程,而是必须等待到进程再次运行时才交给进程。
每次进程从系统调用中退出前,它都会检查signal和blocked域,看是否有可以立刻发送的非阻塞信号。
这看起来非常不可靠,但是系统中每个进程都在不停地进行系统调用,如向终端输出字符。
当然进程可以选择去等待信号,此时进程将一直处于可中断状态直到信号出现。
对当前不可阻塞信号的处理代码放置在sigaction结构中。
如果信号的处理过程被设置成缺省则由核心来应付它。
SIGSTOP信号的缺省处理过程是将当前进程的状态改变成为Stopped并运行调度管理器以选择一个新进程继续运行。
SIGFPE的缺省处理过程则是引起core dump并使进程退出。
当然,进程可以定义其自身的信号处理过程。
一旦信号产生,这个过程就将被调用。
它的地址存储在sigaction结构中。
核心必须调用进程的信号处理例程,具体如何去做依赖于处理器类型,但是所有的CPU 必须处理这个问题:如果信号产生时,当前进程正在核心模式下运行并且马上要返回调用核心或者系统例程的进程,而该进程处在用户模式下。
解决这个问题需要操纵进程的堆栈及寄存器。
进程的程序计数器被设置成其信号处理过程的地址,而参数通过调用框架或者寄存器传递到处理例程中。
当进程继续执行时,信号处理例程好象普通的函数调用一样。
Linux是POSIX兼容的,所以当某个特定信号处理例程被调用时,进程可以设定哪个信号可以阻塞。
这意味着可以在进程信号处理过程中改变blocked屏蔽码。
当信号处理例程结束时,此blocked屏蔽码必须设置成原有值。
因此,Linux 添加了一个过程调用来进行整理工作,通过它来重新设置被发送信号进程调用栈中的原有blocked屏蔽码。
对于同一时刻几个信号处理过程,Linux通过堆栈方式来优化其使用,每当一个处理过程退出时,下一个处理过程必须等到整理例程结束后才执行。
管道一般的Linux shell程序都允许重定向。
如$ ls | pr | lpr在这个管道应用中,ls列当前目录的输出被作为标准输入送到pr程序中,而pr 的输出又被作为标准输入送到lpr程序中。
管道是单向的字节流,它将某个进程的标准输出连接到另外进程的标准输入。
但是使用管道的进程都不会意识到重定向的存在,并且其执行结果也不会有什么不同。
shell程序负责在进程间建立临时的管道。
管道在Linux中,管道是通过指向同一个临时VFS inode的两个file数据结构来实现的,此VFS inode指向内存中的一个物理页面。
图5.1中每个file数据结构指向不同的文件操作例程向量,一个是实现对管道的写,另一个从管道中读。
这样就隐藏了读写管道和读写普通的文件时系统调用的差别。
当写入进程对管道写时,字节被拷贝到共享数据页面中,当读取进程从管道中读时,字节从共享数据页面中拷贝出来。
Linux必须同步对管道的访问。
它必须保证读者和写者以确定的步骤执行,为此需要使用锁、等待队列和信号等同步机制。
当写者想对管道写入时,它使用标准的写库函数。
表示打开文件和打开管道的描叙符用来对进程的file数据结构集合进行索引。
Linux系统调用使用由管道file数据结构指向的write过程。
这个write过程用保存在表示管道的VFS inode 中的信息来管理写请求。
如果没有足够的空间容纳对所有写入管道的数据,只要管道没有被读者加锁。
则Linux为写者加锁,并把从写入进程地址空间中写入的字节拷贝到共享数据页面中去。
如果管道被读者加锁或者没有足够空间存储数据,当前进程将在管道inode的等待队列中睡眠,同时调度管理器开始执行以选择其它进程来执行。
如果写入进程是可中断的,则当有足够的空间或者管道被解锁时,它将被读者唤醒。
当数据被写入时,管道的VFS inode被解锁,同时任何在此inode的等待队列上睡眠的读者进程都将被唤醒。
从管道中读出数据的过程和写入类似。
进程允许进行非阻塞读(这依赖于它们打开文件或者管道的方式),此时如果没有数据可读或者管道被加锁,则返回错误信息表明进程可以继续执行。
阻塞方式则使读者进程在管道inode的等待队列上睡眠直到写者进程结束。
当两个进程对管道的使用结束时,管道inode和共享数据页面将同时被遗弃。
Linux还支持命名管道(named pipe),也就是FIFO管道,因为它总是按照先进先出的原则工作。
第一个被写入的数据将首先从管道中读出来。
和其它管道不一样,FIFO管道不是临时对象,它们是文件系统中的实体并且可以通过mkfifo 命令来创建。
进程只要拥有适当的权限就可以自由使用FIFO管道。
打开FIFO管道的方式稍有不同。
其它管道需要先创建(它的两个file数据结构,VFS inode 和共享数据页面)而FIFO管道已经存在,只需要由使用者打开与关闭。
在写者进程打开它之前,Linux必须让读者进程先打开此FIFO管道;任何读者进程从中读取之前必须有写者进程向其写入数据。
FIFO管道的使用方法与普通管道基本相同,同时它们使用相同数据结构和操作。
套接口系统V IPC机制Linux支持Unix系统V(1983)版本中的三种进程间通讯机制。
它们是消息队列、信号灯以及共享内存。
这些系统V IPC机制使用共同的授权方法。
只有通过系统调用将标志符传递给核心之后,进程才能存取这些资源。
这些系统V IPC对象使用与文件系统非常类似的访问控制方式。
对象的引用标志符被用来作为资源表中的索引。
这个索引值需要一些处理后才能得到。
系统中所有系统V IPC对象的Linux数据结构包含一个ipc_perm结构,它含有进程拥有者和创建者及组标志符。
另外还有对此对象(拥有者,组及其它)的存取模式以及IPC对象键。
此键值被用来定位系统V IPC对象的引用标志符。
这样的键值一共有两组:公有与私有。
如果此键为公有,则系统中任何接受权限检查的进程都可以找到系统V IPC对象的引用标志符。
系统V IPC对象绝不能用一个键值来引用,而只能使用引用标志符。
消息队列消息队列允许一个或者多个进程向它写入与读取消息。
Linux维护着一个msgque 消息队列链表,其中每个元素指向一个描叙消息队列的msqid_ds结构。
当创建新的消息队列时,系统将从系统内存中分配一个msqid_ds结构,同时将其插入到数组中。
系统V IPC消息队列每个msqid_ds结构包含一个ipc_perm结构和指向已经进入此队列消息的指针。
另外,Linux保留有关队列修改时间信息,如上次系统向队列中写入的时间等。
msqid_ds包含两个等待队列:一个为队列写入进程使用而另一个由队列读取进程使用。
每次进程试图向写入队列写入消息时,系统将把其有效用户和组标志符与此队列的ipc_perm结构中的模式进行比较。
如果允许写入操作,则把此消息从此进程的地址空间拷贝到msg数据结构中,并放置到此消息队列尾部。