当前位置: 首页 > news >正文

二手交易网站怎么做屏蔽ip网站

二手交易网站怎么做,屏蔽ip网站,wordpress连接小程序,人力资源公司代缴社保合法吗文章目录 背景运行环境 文件系统对比linux下的文件系统mac下的文件系统linux下的mv指令 golang的os.Rename源码os.Renamesyscall.Renamesyscall.RenameatSYS_RENAMEAT是什么 查看系统调用函数文档什么是man pageman page的用法user commandssystem calls renameat不支持跨挂载点… 文章目录 背景运行环境 文件系统对比linux下的文件系统mac下的文件系统linux下的mv指令 golang的os.Rename源码os.Renamesyscall.Renamesyscall.RenameatSYS_RENAMEAT是什么 查看系统调用函数文档什么是man pageman page的用法user commandssystem calls renameat不支持跨挂载点调用strace确定程序调用了renameat 怎么避免错误总结 背景 在执行go程序的时候其中有一步是把/tmp目录下的一个文件移动到用户目录下使用go的os.Rename函数来实现。经测试在mac上是可以正常跑的但是在linux机器上却报错了。报错如下 go run ./script/download-go go1.22.3 download from https://go.dev/dl/go1.22.3.linux-amd64.tar.gz% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed 100 75 100 75 0 0 53 0 0:00:01 0:00:01 --:--:-- 53 100 65.7M 100 65.7M 0 0 160k 0 0:07:00 0:07:00 --:--:-- 419k rename /tmp/go2503368948/go go-release/go1.22.3: invalid cross-device link exit status 1错误信息 invalid cross-device link 表明 /tmp 目录和 go-release 目录是在不同的文件系统中。也就是说不能把一个文件从一个文件系统移动或重命名到另一个文件系统。os.Rename算是比较常用的文件操作函数博主一直把os.Rename当作mv在使用也一直没有遇到过这个问题还是挺奇怪的值得探索一下出错的原因。 运行环境 操作系统: linux_x86_64CPU架构: amd_64Golang: 1.22.2 文件系统对比 linux下的文件系统 dfFilesystem Size Used Avail Use% Mounted on dev 7.6G 0 7.6G 0% /dev run 7.7G 3.2M 7.7G 1% /run /dev/nvme0n1p2 916G 299G 571G 35% / tmpfs 7.7G 50M 7.6G 1% /dev/shm tmpfs 7.7G 24K 7.7G 1% /tmpmac下的文件系统 df Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on /dev/disk3s3s1 965595304 28934208 217744920 12% 387452 1088724600 0% / devfs 400 400 0 100% 692 0 100% /dev /dev/disk3s6 965595304 40 217744920 1% 0 1088724600 0% /System/Volumes/VM /dev/disk3s4 965595304 22879080 217744920 10% 1372 1088724600 0% /System/Volumes/Preboot 可以看到mac系统上/根目录都对应同一个挂载点和同一个文件系统。而在我的linux开发机上/tmp是另一个挂载点和文件系统根据报错信息来看也是符合预期的。 linux下的mv指令 测试从/tmp目录移动文件到用户目录下结果是可行的并没有报错。 golang的os.Rename源码 直接去源码里面找代码看下源码目录为GOROOT目录下面的src目录。因为没有配置vim环境所以只能通过rg的方式来找了。 os.Rename rg Rename// file_unix.go return syscall.Rename(oldname, newname)syscall.Rename // cd syscall // rg Raname// syscall_linux.go文件unc Rename(oldpath string, newpath string) (err error) {return Renameat(_AT_FDCWD, oldpath, _AT_FDCWD, newpath) syscall.Renameat // zsyscall_linux_amd64.go 文件func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) {var _p0 *byte_p0, err BytePtrFromString(oldpath)if err ! nil {return}var _p1 *byte_p1, err BytePtrFromString(newpath)if err ! nil {return}// 调用的是SYS_RENAMEAT这个系统调用_, _, e1 : Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0)if e1 ! 0 {err errnoErr(e1)}return}// zsysnum_linux_amd64.go// 对应的系统调用编号是264SYS_RENAMEAT 264SYS_RENAMEAT是什么 对于linux操作系统每个系统调用在系统调用表中都有一个唯一的编号。这个编号就是系统调用的标识当用户的程序想要进行系统调用时会使用这个编号对系统调用进行引用。用户的程序只能通过这个编号与系统调用交互及进行相关的读、写、打开文件或者申请内存等操作。而这里的SYS_RENAMEAT对应的就是系统调用的编号可以搜索: **Linux System Call Table **来查看不同CPU架构对应的系统调用编号。 参考https://www.chromium.org/chromium-os/developer-library/reference/linux-constants/syscalls/x86_64 查看系统调用函数文档 man page文档 什么是man page 简单来说就是linux系统的API文档介绍主要介绍系统提供的命令含义及用法。但是系统文档相对来说还是比较长的因此著名的开源项目TLDR(https://github.com/tldr-pages/tldr) 也是由此而来旨在简化man page带来的长文本负担。TL;DR 代表“太长没有读”。它起源于互联网俚语用于表示长文本或其中的一部分因太长而被跳过。 man page的用法 用法介绍网上一大堆这里只聚焦我们的问题怎么查看系统调用函数的介绍。首先man page对这些系统函数是做了分区的如下 user commands 就是常用的命令行函数都在这里例如ls。左上角的LS(1)就代表在分区1 // man 1 ls LS(1) User Commands LS(1)NAMEls - list directory contentsSYNOPSISls [OPTION]... [FILE]...DESCRIPTIONList information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.Mandatory arguments to long options are mandatory for short options too.-a, --alldo not ignore entries starting with .-A, --almost-alldo not list implied . and ..system calls 系统调用函数这里拿renameat举例子左上角的rename(2)代表的就是系统调用函数。 man 2 renamertrename(2) System Calls Manual rename(2)NAMErename, renameat, renameat2 - change the name or location of a fileLIBRARYStandard C library (libc, -lc)SYNOPSIS#include stdio.hint rename(const char *oldpath, const char *newpath);#include fcntl.h /* Definition of AT_* constants */#include stdio.hint renameat(int olddirfd, const char *oldpath,int newdirfd, const char *newpath);int renameat2(int olddirfd, const char *oldpath,int newdirfd, const char *newpath, unsigned int flags);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):renameat():Since glibc 2.10:_POSIX_C_SOURCE 200809LBefore glibc 2.10:_ATFILE_SOURCErenameat2():_GNU_SOURCErenameat不支持跨挂载点调用 EXDEV oldpath and newpath are not on the same mounted filesystem. (Linux permits a filesystem to be mounted at multiple points, but rename() does notwork across different mount points, even if the same filesystem is mounted on both.)这里已经明确说了不允许跨挂载点的调用哪怕是同一个文件系统也不行。 strace确定程序调用了renameat // 只显示 renameat 的调用情况 strace -f -e tracerenameat go run ./script/download-go go1.22.3// 结果 [pid 92270] renameat(AT_FDCWD, /tmp/go734096947/go, AT_FDCWD, go-release/go1.22.3) -1 EXDEV (Invalid cross-device link)结合上面的系统调用函数分析已经明确了根因。 怎么避免错误 参考golang社区关于os.Rename的讨论开源社区的方案csdn上的避免方案目前os包没有直接提供类似于mv的函数常规解决方案就是先copy再rename这样就能避免跨挂载点工作导致的错误。 总结 本来只是个小问题知道报错的含义之后很容易就会想到避免错误的方案。但是寻根问底也是工程师的天性知其然更要知其所以然。哀吾生之须臾羡知识之无穷。 end
http://www.dnsts.com.cn/news/54770.html

相关文章:

  • 58临沂网站建设263企业邮箱手机入口登录
  • 天眼官方网站ppt资源网免费
  • 网站空间要备案吗网站建设先进个人自荐
  • 宁波网站设计推广培训班做网站的主要作用
  • 苏州网站开发建设方法现在ps做网站的尺寸
  • 中职教材 网站建设上海装修公司电话
  • 网站建设产品说明书网络设计方案ppt
  • 论坛网站开发demo响应式网站的组成
  • 网站建设项目分析报告阜宁网站制作具体报价
  • 淄博网站建设多少钱关键词搜索站长工具
  • 全屏网站尺寸新开传奇网站服
  • 涪陵网站制作抑郁症图片加时间生成器在线制作
  • 做网页和做网站手册 久久建筑网
  • 西安网站的设计说明买房网站怎么做
  • 网站开发用了什么平台网页设计logo图片
  • 广州海外建站wordpress 数据库名贵
  • 做羞羞的事情网站wordpress linux迁移
  • 免费制作网站平台哪个好成都网站界面设计
  • 接私活做网站要不要签合同wap网站报价
  • 最干净在线代理建站优化一条龙
  • 管理案例网站个人如何制作微信小程序
  • 单品网站模板wordpress ftp免密码破解
  • 漳州专业网站建设费用google免费vps
  • 雁塔区网站建设重庆市建设执业注册中心网站
  • 服务器网站环境小程序制作网站
  • phpcms移动端网站怎么做金华网站建设多少钱
  • 百度收录哪些网站吗app软件开发就是网站开发吗
  • 北京门户网站有哪些泉州网站排名
  • 网站后台管理系统进度高端旅游网站制作
  • 电子商务网站建设与维护李建忠气象网站建设的自查报告