linux管道(pipeline)

linux管道(pipeline),第1张

管道就是我们生活中看到的净水,它有两个水口,一个连接着进水管,一个连接着出水管,通过这个管道,我们就可以把水流一步步过滤处理,最终输出我们想要的净水。

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 System

using 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.Pipes

using 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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12336946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存