管道读写的阻塞与非阻塞

在管道文件为阻塞读和阻塞写的时候,无论是先读还是先写都要等到另一个操作才能离开阻塞,也就是:

如果先读,陷入阻塞,等待写操作;如果先写,陷入阻塞,等待读操作。

而非阻塞读和非阻塞写,是无须等待另一个操作的,直接执行read()或者write()能读就读,能写就写,不能就返回-1,非阻塞读写主要是用于自己循环读取,去判断读写的长度

在使用非阻塞的时候,有一个很需要注意的地方,在fifo的man page中,有一段这样的描述:

A process can open a FIFO in nonblocking mode. In this case, opening for read-only will succeed even if no-one has opened on the write side yet, opening for write-only will fail with ENXIO (no such device or address) unless the other end has already been opened.

也就是说非阻塞模式下,以只读模式是可以open成功获得文件描述符,即使没有写端;然而,如果写端没有打开的话,只读模式是无法open成功,在确认文件存在(access(file_name, F_OK)==0)的情况下,却open返回-1往往是这个原因,可以使用循环open,或者确保写端已经打开的方法避免。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用异步方式实现的非阻塞命名管道通信的例子: ```csharp using System; using System.IO.Pipes; using System.Text; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { // 创建命名管道 var pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous); // 等待客户端连接 await pipeServer.WaitForConnectionAsync(); // 从客户端读取数据 byte[] buffer = new byte[1024]; int bytesRead = await pipeServer.ReadAsync(buffer, 0, buffer.Length); string data = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("Received data: " + data); // 向客户端发送数据 string response = "Hello, client!"; byte[] responseBuffer = Encoding.UTF8.GetBytes(response); await pipeServer.WriteAsync(responseBuffer, 0, responseBuffer.Length); // 关闭管道 pipeServer.Close(); } } ``` 在上面的代码中,我们使用 `await` 关键字来等待客户端连接和数据读写操作完成,这样就可以避免阻塞主线程。同时,我们还设置了 `PipeOptions.Asynchronous` 选项来启用异步操作。 需要注意的是,使用异步方式实现非阻塞命名管道通信时,我们需要使用与 `NamedPipeServerStream` 类中异步方法配套的异步方式进行读写操作。例如,使用 `ReadAsync` 方法进行读取操作,使用 `WriteAsync` 方法进行写入操作。 希望这个例子能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值