Golang 异步(bsd/linux)io

Golang 异步(bsd/linux)io

在日常开发中,读写文件的底层调用函数是syscall.Read/Write。一切都是围绕这两个函数展开的,不过有时候需要或者就是单纯想异步执行。liburing是linux上一个很好的原生异步io库,这里需要适配bsd派系的系统,所以选择的是另一款libaio,这款异步io库在bsd派系(macos,freebsd,openbsd…)和linux上都是存在的。
golang 类unix系统下 os.OpenFile函数的底层(windows就不要来找茬了:-(
请添加图片描述
写入文件的底层:syscall.Write是系统写入函数,ignoringEINTRIO函数会回调传入的syscall.Write函数
请添加图片描述

package main
//由于golang系统调用中没有定义aio需要用到的关键结构体aiocb,所以我们需要借助cgo来使其生成一份golang的aiocb结构体
/*
#include <aio.h>
*/
import "C"
import ("fmt""log""syscall""time""unsafe"
)type File struct {fd int
}
type AIOCB C.struct_aiocbfunc OpenFile(pathname string, mode, perm int) (*File, error) {fd, err := syscall.Open(pathname, mode, uint32(perm))if err != nil {return nil, err}//bsd派系系统走此函数设定绕过内核和用户层缓冲区,linux系统直接上方mode加入O_DIRECT即可syscall.Syscall(syscall.SYS_FCNTL, uintptr(fd), syscall.F_NOCACHE, 0)var f = File{fd: fd}return &f, nil
}
func (f *File) Write(b []byte) *AIOCB {var aiocb AIOCBaiocb.aio_buf = unsafe.Pointer(&b[0])blen := len(b)aiocb.aio_nbytes = C.size_t(blen)aiocb.aio_fildes = C.int(f.fd)syscall.Syscall(syscall.SYS_AIO_WRITE, uintptr(unsafe.Pointer(&aiocb)), 0, 0)return &aiocb
}
func (f *File) Close() error {return syscall.Close(f.fd)
}
func (f *File) Read(b []byte) *AIOCB {var aiocbp AIOCBaiocbp.aio_buf = unsafe.Pointer(&b[0])aiocbp.aio_nbytes = C.size_t(len(b))aiocbp.aio_fildes = C.int(f.fd)syscall.Syscall(syscall.SYS_AIO_READ, uintptr(unsafe.Pointer(&aiocbp)), 0, 0)return &aiocbp
}
//由于异步操作会立即返回,所以刚刚操作返回的aiocb结构体的指针非常关键,千万不要丢了,如果需要知道写入或读出操作有没有完成,需要通过aio_return这个函数来感知,如果操作未完成会返回-1
func Verify(a *AIOCB) int {ans, _, _ := syscall.Syscall(syscall.SYS_AIO_RETURN, uintptr(unsafe.Pointer(a)), 0, 0)return int(int32(ans))
}

由于异步操作会立即返回,所以刚刚操作返回的aiocb结构体的指针非常关键,千万不要丢了,如果需要知道写入或读出操作有没有完成,需要通过aio_return这个函数来感知,如果操作未完成会返回-1

测试代码

func main() {f, err := OpenFile("test.txt", syscall.O_CREAT|syscall.O_RDONLY, 0644)if err != nil {log.Fatalln(err)}defer f.Close()var b []byte = make([]byte, 128)status := f.Read(b)fmt.Println(Verify(status))time.Sleep(time.Second)fmt.Println(Verify(status))
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iostream、fstream、sstream、string、vector、unordered_map、stack

iostream 用于输入输出操作&#xff0c;包含了处理标准输入输出流的功能&#xff08;例如&#xff0c;cin, cout, cerr等&#xff09;。 #include <iostream>int main() {int number;std::cout << "Enter a number: ";std::cin >> number;std::…

像uniapp image标签一样对图片进行缩放和裁剪

像uniapp image标签一样对图片进行缩放和裁剪 0 前言提示1 实现1.1 不保持纵横比缩放图片&#xff0c;使图片的宽高完全拉伸至填满 image 元素1.2 保持纵横比缩放图片&#xff0c;使图片的长边能完全显示出来。也就是说&#xff0c;可以完整地将图片显示出来。1.3 保持纵横比缩…

Amuse .NET application for stable diffusion

Amuse github地址&#xff1a;https://github.com/tianleiwu/Amuse .NET application for stable diffusion, Leveraging OnnxStack, Amuse seamlessly integrates many StableDiffusion capabilities all within the .NET eco-system Welcome to Amuse! Amuse is a profes…

uni-app 中两个系统各自显示不同的tabBar

最近在一个uni-app项目中遇到一个需求,在登录页面成功登录以后需要判断身份,不同的身份的进入不同的tabBar页面,但是在uni-app项目中pages.json中的tabBar的list数组只有一个&#xff0c;且不能写成动态的,那如何实现这个需求呢?答案是需要我们自定义tabBar。 目录 1、我们确…

vue+elementUI实现树形穿梭框

1.实现效果 2.整体思路 将左侧选中的节点移动到右侧&#xff0c;还要保持树结构&#xff0c;意味着移动子节点&#xff0c;需要把该子节点对应的父节点甚至父节点的父节点一并移到右侧形成一个新的树结构&#xff0c;树结构的层级和原来的树保持一致&#xff0c;只是右侧展示…

QML 绘制PieSeries(饼状图)

一.PieSeries(饼状图)介绍 在QML中绘制饼状图主要依赖于Qt提供的QtCharts模块。该模块包含了一系列用于绘制图表的类&#xff0c;其中PieSeries类专门用于创建饼状图。 以下是一些关于使用QtCharts在QML中绘制饼状图的介绍&#xff1a; PieSeries属性&#xff1a;PieSeries是绘…

Sora后时代文生视频的探索

一、写在前面 按常理&#xff0c;这里应该长篇大论地介绍一下Sora发布对各行业各方面产生的影响。不过&#xff0c;这类文章已经很多了&#xff0c;我们今天主要聊聊那些已经成熟的解决方案、那些已经可以“信手拈来”的成果&#xff0c;并以此为基础&#xff0c;看看Sora发布…

练习实践-TLS协议01-Wireshark对https数据的解密

参考来源&#xff1a; https://zhuanlan.zhihu.com/p/36669377 https://blog.csdn.net/u010726042/article/details/53408077 思路&#xff1a; wireshark抓到的https流量包经过了ssl加密&#xff0c;那么我们如何才能查看解密的数据呢&#xff1f;Firefox和Chrome浏览器都支…

ubuntu显卡驱动安装

最近电脑显示器频繁出现故障导致显卡驱动总是出问题&#xff0c;找到了一套简单、有效的显卡驱动安装方式&#xff0c;记录一下方便下次出问题时候用。 参考了以下文章&#xff1a; Ubuntu18-22.04安装和干净卸载nvidia显卡驱动——超详细、最简单 Ubuntu 安装显卡驱动 显卡驱…

海外云手机如何帮助亚马逊引流?

随着全球化的推进&#xff0c;出海企业和B2B外贸企业越来越注重海外市场的开拓&#xff0c;这已成为企业争夺市场份额的重要策略。本文将重点探讨海外云手机在优化亚马逊店铺引流方面的作用和优势。 海外云手机是一种在云端运行的虚拟手机&#xff0c;能够在单一芯片上多开几个…

python爬虫基础实验:通过DBLP数据库获取数据挖掘顶会KDD在2023年的论文收录和相关作者信息

Task1 读取网站主页整个页面的 html 内容并解码为文本串&#xff08;可使用urllib.request的相应方法&#xff09;&#xff0c;将其以UTF-8编码格式写入page.txt文件。 Code1 import urllib.requestwith urllib.request.urlopen(https://dblp.dagstuhl.de/db/conf/kdd/kdd202…

PyTorch 深度学习(GPT 重译)(二)

四、使用张量表示真实世界数据 本章内容包括 将现实世界的数据表示为 PyTorch 张量 处理各种数据类型 从文件加载数据 将数据转换为张量 塑造张量&#xff0c;使其可以作为神经网络模型的输入 在上一章中&#xff0c;我们了解到张量是 PyTorch 中数据的构建块。神经网络…

Excel使用VLOOKUP函数

VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) 释义&#xff1a; lookup_value&#xff1a;要查找的值&#xff0c;包括数字&#xff0c;文本等 table_array&#xff1a;要查找的值以及预期返回的内容所在的区域 col_index_num&#xff1a;查找的区域的列…

微信小程序订阅消息(一次性订阅消息)

1、准备工作 登录微信公众平台–>订阅消息–>在公共模板库中选中一个模版–>将模版id复制&#xff0c;前后端都需要。 点击详情–>查看详细内容模版 复制给后端 2、相关api的使用 前端使用&#xff1a;wx.requestSubscribeMessage wx.openSetting wx.getSetti…

Gateway新一代网关

Gateway新一代网关 1、概述 ​ Cloud全家桶中有个很重要的组件就是网关&#xff0c;在1.x版本中都是采用的Zuul网关&#xff1b; ​ 但在2.x版本中&#xff0c;zuul的升级一直跳票&#xff0c;SpringCloud最后自己研发了一个网关SpringCloud Gateway替代Zuul。 ​ 官网&…

ubuntu部署wireguard服务端,ubuntu部署wireguard客户端

docker部署方式 docker run -d \--namewg-easy \-e WG_HOST6.6.6.6服务端IP \-e PASSWORD123abc登陆管理密码 \-e WG_DEFAULT_ADDRESS10.0.8.x客户端 IP 地址范围 \-e WG_DEFAULT_DNS1.1.1.1配置dns \-e WG_ALLOWED_IPS10.0.8.0/24 \-e WG_PERSISTENT_KEEPALIVE25 \-v ~/.wg-e…

uniapp、vue2.6、H5,利用腾讯TRTC,快速跑通1v1视频功能

多人视频聊天室搭建&#xff0c;官网已有相关demo和案例&#xff0c;需要快速搭建多人聊天室直接进入以下网站&#xff1a; 实时音视频 Web & H5 (Vue2/Vue3)-视频通话&#xff08;含 UI&#xff09;-文档中心-腾讯云说明&#xff1a;https://cloud.tencent.com/document/…

北斗短报文+4G应急广播系统:全面预警灾害信息 构建安全美好乡村

建设社会主义新农村是确保小康社会宏伟目标如期实现的必然要求&#xff0c;是构建和谐社会的重要内容。针对现代农业发展的要求&#xff0c;通过完善专业化监测预报技术&#xff0c;提高精细化的灾害监测预警能力&#xff0c;建设广覆盖的预警信息发布网络&#xff0c;建设有效…

练习 9 Web [SUCTF 2019]CheckIn (未拿到flag)

上传图片格式的木马文件&#xff1a; 返回 <? in contents!,存在PHP代码检测 上传非图片格式文件&#xff1a; 返回 不允许非image 修改木马PHP代码规避检测 <? ?> 改为 < script language“php”>< /script ><?php eval($_POST[shell]);?>…

PyTorch 深度学习(GPT 重译)(四)

第二部分&#xff1a;从现实世界的图像中学习&#xff1a;肺癌的早期检测 第 2 部分的结构与第 1 部分不同&#xff1b;它几乎是一本书中的一本书。我们将以几章的篇幅深入探讨一个单一用例&#xff0c;从第 1 部分学到的基本构建模块开始&#xff0c;构建一个比我们迄今为止看…