
linux中的管道也是同样的道理,它使用|表示。
比如我们经常看到统计排序的例子
为了避免死锁并利用并行性,通常,带有一个或多个新管道的Unix进程将调用fork()创建新进程。然后,每个过程将在产生或使用任何数据之前关闭将不使用的管道末端。或者,进程可以创建一个新线程并使用管道在它们之间进行通信。
也可以使用mkfifo()或创建命名管道mknod(),然后在调用它们时将它们作为输入或输出文件呈现给程序。它们允许创建多路径管道,并且在与标准错误重定向或结合使用时特别有效。
//创建server管道。mkfifo(Server_FIFO_Name,0777)
//打开服务器端口,等待读取。此时如果客户端还未写入数据服务器端会被阻塞。
server_fifo_fd = open(Server_FIFO_Name , O_RDONLY)
if( -1 == server_fifo_fd ){
fprintf( stderr , "Server fifo failure\n" )
exit(EXIT_FAILURE)
}
//从管道中读取数据。
read_res = read ( server_fifo_fd , &my_data , sizeof(my_data))
if(read_res >0){
//将字符串翻转.
reverse ( my_data.str )
//将客户端的pid号加入回送管道文件名中.
sprintf ( client_fifo, Client_FIFO_Name , my_data.client_pid)
//打开回送管道。
client_fifo_fd = open ( client_fifo , O_WRONLY )
if( -1 != client_fifo_fd ){
//向管道中写入返回的数据.
write ( client_fifo_fd , &my_data, sizeof(my_data))
close ( client_fifo_fd )
}
}
管道是进程间通信的主要手段之一。一个管道实际上就是个只存在于内存中的文件,对这个文件的 *** 作要通过两个已经打开文件进行,它们分别代表管道的两端。管道是一种特殊的文件,它不属于某一种文件系统,而是一种独立的文件系统,有其自己的数据结构。根据管道的适用范围将其分为:无名管道和命名管道。
主要用于父进程与子进程之间,或者两个兄弟进程之间。在linux系统中可以通过系统调用建立起一个单向的通信管道,且这种关系只能由父进程来建立。
命名管道是建立在实际的磁盘介质或文件系统(而不是只存在于内存中)上有自己名字的文件,任何进程可以在任何时间通过文件名或路径名与该文件建立联系。为了实现命名管道,引入了一种新的文件类型——FIFO文件(遵循先进先出的原则)。
实现一个命名管道实际上就是实现一个FIFO文件。命名管道一旦建立,之后它的读、写以及关闭 *** 作都与普通管道完全相同。虽然FIFO文件的inode节点在磁盘上,但是仅是一个节点而已,文件的数据还是存在于内存缓冲页面中,和普通管道相同。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)