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 )
}
}
使用命名管道(Named pipe)实现进程悉伏间通信。
1)在Visual Studio中新建一个“控制台应用程序”项目,项目名称改为ConsoleAppServer
2)在ConsoleAppServer项目的Program.cs中输入代码
using Systemusing System.IO
using System.IO.Pipes
namespace ConsoleAppServer
{
class Program
{
static void Main(string[] args)
{
using (NamedPipeServerStream server
= new NamedPipeServerStream("testing"闷蚂))
{
// 等待客户端连接
server.WaitForConnection()
// 接收来自客户端的数据并打印出来
using (StreamReader sr = new StreamReader(server))
{
string message = sr.ReadToEnd()
Console.WriteLine(message)
}
}
// 按任意键退出程序
Console.ReadKey()
}
}
}
3)保持包含ConsoleAppServer项目的Visual Studio打开,再启动Visual Studi哦窗口,并新建一个“控制台应用程序”项目,项目名称改为ConsoleAppClient
4)在ConsoleAppClient项目的Program.cs中输入一下代码
using System.IO.Pipesusing System.IO
namespace ConsoleAppClient
{
class Program
{
static void Main(string[] args)
{
using (NamedPipeClientStream client
睁罩携 = new NamedPipeClientStream("testing"))
{
// 连接命名管道服务器,管道名称为testing
client.Connect()
// 向服务器发送一个字符串
using (StreamWriter sw = new StreamWriter(client))
{
sw.WriteLine("来自客户端的信息")
sw.Flush()
}
}
// 按任意键退出程序
Console.ReadKey()
}
}
}
5)分别编译这个两个项目
6)先运行ConsoleAppServer, 然后再运行ConsoleAppClient
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)