首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

io_uring 从原理到动手实践 part1: 使用系统调用接口实现 cat 程序

这将使您熟悉 readv(),它是启用分散/聚集 I/O 的系统调用集的一部分,也称为向量 I/O。如果您熟悉 readv() 工作方式,则可以跳到下一节。...答案是使用 readv() 和 writev() 更自然。例如,使用readv(),您可以填充一个 struct 的许多成员,而无需求助于复制缓冲区或多次调用read(),这两种方法的效率都相对较低。...我们迭代等于文件大小的块数的计数,分配块大小的内存来保存实际数据,最后调用 readv() 读取数据。就像我们之前讨论过的,readv() 这里是同步的。这意味着它会阻塞,直到它满足了它被调用的请求。...您将使用readv()系统调用读取文件: opcode用于指定操作,在我们的例子中,readv() 使用 IORING_OP_READV 常量。 fd 用于指定我们要读取的文件。...你可以提交 * 我们的将是 readv() 请求,通过 IORING_OP_READV 指定。

1.2K20

【原创】通过 ioctl + FIONREAD 判定数据可读「建议收藏」

gettimeofday({ 1445666438, 713982}, NULL) = 0 14:00:38 ioctl(31, FIONREAD, [16]) = 0 14:00:38 readv...NULL) = 0 发现此时 socket 中可读数据为 0 14:00:43 ioctl(31, FIONREAD, [0]) = 0 这里会看到一些乱七八糟的数据(应该是由于 readv...用于保存读取结果的 buffer 没有清空的缘故) 14:00:43 readv(31, [{ "[pid]:25002 [UpuWrapper]: [UpuClientMsgCallBack...readv 在两种情况都进行了数据读取,TCP 链路正常情况下,readv 返回读取的数据字节数;TCP 链路异常情况下,readv 返回 0 。...=== 我是琅琊榜的分隔线 === 乍一看,似乎帖子中描述的情况和上面 TCP 链路断开时的情况类似,但事实上是不同的,关键在于 readv 的返回值为 0 ,至于 readv

89840

字节开源的netPoll底层LinkBuffer设计与实现

= 0 { return int(r), syscall.Errno(e) } // 返回成功写入的字节数量 return int(r), nil } // readv 包装readv系统调用..., 返回 0 或 nil 表示数据读完了 // readv则将从fd读入的数据按同样的顺序散布到各缓冲区中,readv总是先填满一个缓冲区,然后再填下一个 func readv(fd int, bs...指向 bs[i] , 也就是将bs作为最终接收数据的缓冲区 iovLen := iovecs(bs, ivs) if iovLen == 0 { return 0, nil } // 执行readv...系统调用,将数据读取到ivs[i].base指针指向的缓冲区中 r, _, e := syscall.RawSyscall(syscall.SYS_READV, uintptr(fd), uintptr...() 、 writev() 关于readv函数实现bug的pr链接: fix: 修复执行syscall.SYS_READV系统调用包装函数readv时,读完数据后,又清空缓冲区的bug #297

27710
领券