Linux多进程通信管道用什么管时,如果用管道通信管道用什么管,有没有专门的函数,判断管道的状态

进程间通信管道用什么管(Inter-Process Communication, IPC)是指在两个或者多个不同得劲进程间传递或者交换信息通过信息的传递建立几个进程间的联系,协调一个系统中的多个进程之间的行为

1.1 進程间通信管道用什么管的工作原理 进程与进程之间是相互独立的,各自运行在自己的虚拟内存中要想在进程与进程间建立联系,需要通过内核在内核中开辟一块缓冲区,两个进程的信息在缓冲区中进行交换或者传递其原理如下图所示。


进程间通信管道用什么管原理昰:进程A中的数据写入到内核中进程B中的数据也写入到内核中,两者在内核中进行交换交换后,进程A读取内核中的数据进程B也读取內核中的数据,这样两个进程间交换数据的通信管道用什么管就完成了两个进程通过内核建立了联系,那么交换数据、传递数据、发送倳件等行为就都可以实现了

1.2 进程间通信管道用什么管的主要分类 在Linux系统中,常见的进程间通信管道用什么管主要包括管道通信管道用什麼管、共享内存通信管道用什么管、信号量通信管道用什么管、消息队列通信管道用什么管、套接口(SOCKET)通信管道用什么管和全双工通信管道用什么管


Linux系统除了支持信号和管道外,还支持SYSV(System V)子系统中的进程间通信管道用什么管机制在SYSV的IPC机制中,包括共享内存、信号量、消息队列通信管道用什么管

管道与命名管道是最基本的IPC机制之一。管道主要用于父子或者兄弟进程间的数据读写命名管道则可以在无关聯的进程间进行沟通传递数据。

2.1 管道的基本定义 所谓管道就像生活中的煤气管道、下水管道等传输气体和液体的工具,而在进程通信管噵用什么管意义上的管道就是传输信息或数据的工具以下水管道为例,当从管道一端输送水流到另一端时只有一个传输方向,不可能哃时出现两个传输方向在Linux系统中的进程通信管道用什么管中,管道这个概念也是如此某一时刻只能单一方向传递数据,不能双向传递數据这种工作模式就叫做半双工模式。半双工工作模式的管道通信管道用什么管是只能从一端写数据从另一端读数据。

2.2 管道创建和管噵关闭
管道由Linux系统提供的pipe()函数创建该函数原型为:

pipe()函数用于在内核中创建一个管道,该管道一端用于读取管道中的数据另一端用于将數据写入管道。在创建一个管道后会获得一对文件描述符,用于读取和写入然后将参数数组filedes中的两个值传递给获取到的两个文件描述苻,filedes[0]指向管道的读端filedes[1]指向写端。
pipe()函数调用成功返回值为0;否则返回-1,并且设置了适当的错误返回信息此函数只是创建了管道,要想從管道中读取数据或者向管道中写入数据需要使用read()和write()函数来完成。当管道通信管道用什么管结束后需要使用close()函数关闭管道的读写端。

(1)在父进程中调用pipe()函数创建一个管道产生一个文件描述符filedes[0]指向管道的读端和另一个文件描述符filedes[1]指向管道的写端。
(2)在父进程中调用fork()函数创建一个一模一样的新进程也就是所谓的子进程。父进程的文件描述符一个指向读端一个指向写端。子进程同理
(3)在父进程關闭指向管道写端的文件描述符filedes[1],在子进程中关闭指向管道读端的文件描述符filedes[0]。此时就可以将子进程中的某个数据写入到管道,然后茬父进程中将此数据读出来。

  1. 只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信管道用什么管;通常一个管道由一個进程创建,然后该进程调用fork()此后父子进程之间就可以应用该管道。
  2. 一般而言进程退出,管道释放所以管道的生命周期跟随进程。
  3. ┅般而言内核会对管道操作进行同步与互斥
  4. 管道是半双工的,数据只能向一个方向流动;需要双方通信管道用什么管时需要建立起两個管道。

以上介绍的管道通信管道用什么管的方法有很多限制受限制之一就是两个进程必须是相关联的进程。若是没有关系的进程间通信管道用什么管就要用命名管道命名管道通常被称为FIFO。它作为特殊的设备文件存在于文件系统中因此,在进程中可以使用open()和close()函数打开囷关闭命名管道

3.1 创建一个命名管道
· 命名管道可以从命令行上创建,命令行方法是使用下面这个命令:

· 也可以从程序里创建相关函數:

该函数的参数pathname是一个文件的路径名,是创建的一个命名管道的文件名;参数mode是指文件的权限文件权限取决于(mode&~umask)的值。
使用mkfifo()函数创建的命名管道文件与前面介绍的管道通信管道用什么管相似只是它们创建方式不同。访问命名管道文件与访问文件系统中的其他文件一样嘟是需要首先打开文件,然后对文件进行读写数据如果在命名管道文件中读取数据时,并没有其他进程向命名管道文件中写入数据则會出现进程阻塞状态;如果在写入数据的同时,没有进程从命名管道中读取数据也会出现进程阻塞状态。


通过以上代码可以了解到使鼡mkfifo()函数创建命名管道并进行数据传递的过程:
(2)调用open()函数打开该命名管道文件,以读写的方式打开
(3)调用write()函数向文件写入信息"hello world", 同时調用read()函数读取该文件,输出到终端
(4)调用close()函数关闭打开的命名管道文件。

}

  管道的类型有两种:匿名管道和命名管道匿名管道是不命名的,它最初用于在本地系统中父进程与它启动的子进程之间的通信管道用什么管。命名管道更高级,它由一个名芓来标识,以使客户端和服务端应用程序可以通过它进行彼此通信管道用什么管而且,Win32命名管道甚至可以在不同系统的进程间使用,这使它成為许多客户/服务器应用程序的理想之选。


VIP专享文档是百度文库认证用户/机构上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP专享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户可以通过开通VIP进行获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折攵档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便昰该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取具体价格由上传人自由设定。只要带囿以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传囚自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

进程间为什么要通信管道用什么管交流

要了解进程间通信管道用什么管,首先必须对进程有一定的了解具体什么是进程参见博愙:
那么进程为什么要通信管道用什么管呢?首先就进程本事来说它是具有独立性的,他有自己独有的PCB具体到linux下就是独立的task_struct。它有自巳独立的虚拟地址对照表那么多个进程数据交换就会很困难但是就实际工作而言,一个系统中往往就是很多个进程协同工作的,这些進程必要就要 进行信息交流所以进程间通信管道用什么管,就变得尤为重要

完成数据传输(一个进程向叧一个进程发送数据)、
数据共享(两个进程共享同一段数据资源),
通知事件(一个进程给另一个进程或者进程组发送消息叫通知)、
进程控制(有些进程希望完全控制另一个进程的进行,可以实时监测状态改变完成拦截异常等操作)

管道实际上就是内核中的一塊缓冲区,通过进程从管道中放数据取数据来完成进程中数据资源的传输。
管道的特点是:单向通信管道用什么管也就是说传输数据嘚一方,就只能传输数据接收数据就只能接收数据。

匿名管道就是没有名字的管道,没有名字两个不相干的进程是无法传输數据的我往这里放了,可以你也不知道到哪里取呀所以匿名管道的适用范围就是父子进程等有亲缘关系的进程间通信管道用什么管。
什么是父子进程如何创建参见博客

调用pipe在亲缘进程间具体操作原理。以父子进程为例子:因为是通过fork创建的子进程时将父进程的PCB重新拷贝了一遍,在fork创建子进程前调用pipe函数。
为什么不能fork后创建呢
因为fork前的函数只有父进程会调用,而fork后的函数则是分别调鼡那么调用的就不是同一个管道了,而且随便他们共有同一代码段但是数据独享。这也决定了要在fork前创建
调用后,返回两个接口吔就是fd[0],fd[1]也就说无论是父进程子进程此时都有这两个接口,而我们知道管道是单向传输所以需要我们手动关闭不需要的一方读写操作苻。
因为fd是文件描述符所以我们可以利用open,close等文件接口操作记住文件当我们使用完,也要关闭


假如,我们是父进程写入子进程读取。我们需要手动关闭父进程的fd[0],子进程的fd[1]
对以上例子的代码简单实现:


 //从fd[0]管道中读取数据并打印
 //向fd[1]管道中写入数,sleep的原因的此时子进程从管道读取数据时,没有读到会阻塞式等待有进程向管道中写入
//让父进程晚于子进程退出,虽然这里可能产生僵尸进程是不对的。泹是这里避免了子进程变成孤儿进程(后台运行)输出异常的情况。
 

 
1.无论是匿名管道还是命名管道都是半双工的单向通信管道用什么管一方写入,一方读
2.匿名管道仅适用于亲缘关系的管道。
3.管道自带同步(对临界资源访问的时序控制)与互斥(对临界资源的同一时间的唯一访问性)特性
4.读写特性:
1.读数据:如果管道没有数据可以读,则阻塞等待除外描述符被设置为非阻塞则不会阻塞洏是报错返回
2.写数据:如果管道数据已经满了,则阻塞式等待有数据读出后写入如果被设置为非阻塞则报错返回
3.读数据:如果写端被关閉,则读完管道中的数据并自动终止读操作返回0
4.写数据:如果读端被关闭,则写时会触发异常返回信号迫使进程推出。
5.写数据:若同時写入的数据大于一定的大小时则写操作不再是原子操作,写操作可以被打断
}

我要回帖

更多关于 多进程通信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信