zoukankan      html  css  js  c++  java
  • [go]os.Open方法源码

    file, err := os.Open("./buf.go")
    
    
    func Open(name string) (*File, error) {
    	return OpenFile(name, O_RDONLY, 0)
    }
    
    
    
    func OpenFile(name string, flag int, perm FileMode) (*File, error) {
    	testlog.Open(name)
    	f, err := openFileNolog(name, flag, perm)
    	if err != nil {
    		return nil, err
    	}
    	f.appendMode = flag&O_APPEND != 0
    
    	return f, nil
    }
    
    
    func openFileNolog(name string, flag int, perm FileMode) (*File, error) {
    	if name == "" {
    		return nil, &PathError{"open", name, syscall.ENOENT}
    	}
    	r, errf := openFile(name, flag, perm)
    	if errf == nil {
    		return r, nil
    	}
    	r, errd := openDir(name)
    	if errd == nil {
    		if flag&O_WRONLY != 0 || flag&O_RDWR != 0 {
    			r.Close()
    			return nil, &PathError{"open", name, syscall.EISDIR}
    		}
    		return r, nil
    	}
    	return nil, &PathError{"open", name, errf}
    }
    
    
    
    func openFile(name string, flag int, perm FileMode) (file *File, err error) {
    	r, e := syscall.Open(fixLongPath(name), flag|syscall.O_CLOEXEC, syscallMode(perm))
    	if e != nil {
    		return nil, e
    	}
    	return newFile(r, name, "file"), nil
    }
    
    
    func newFile(h syscall.Handle, name string, kind string) *File {
    	if kind == "file" {
    		var m uint32
    		if syscall.GetConsoleMode(h, &m) == nil {
    			kind = "console"
    		}
    		if t, err := syscall.GetFileType(h); err == nil && t == syscall.FILE_TYPE_PIPE {
    			kind = "pipe"
    		}
    	}
    
    	f := &File{&file{
    		pfd: poll.FD{
    			Sysfd:         h,
    			IsStream:      true,
    			ZeroReadIsEOF: true,
    		},
    		name: name,
    	}}
    	runtime.SetFinalizer(f.file, (*file).close)
    
    	// Ignore initialization errors.
    	// Assume any problems will show up in later I/O.
    	f.pfd.Init(kind, false)
    
    	return f
    }
    
    
    type File struct {
    	*file // os specific
    }
    
    
    type file struct {
    	pfd        poll.FD
    	name       string
    	dirinfo    *dirInfo // nil unless directory being read
    	appendMode bool     // whether file is opened for appending
    }
    
    func (f *File) write(b []byte) (n int, err error) {
    	n, err = f.pfd.Write(b)
    	runtime.KeepAlive(f)
    	return n, err
    }
    
    • 小结
    os.Open("/etc/hosts") //只读模式
        OpenFile(name, O_RDONLY, 0)
            openFileNolog(name, flag, perm)
                newFile(uintptr(r), name, kindOpenFile)
    
  • 相关阅读:
    日常排雷:redis报错 could not get a resource from the pool
    阿里云centos服务器tomcat启动后,浏览器请求无响应
    并发生产顺序单据号测试
    json 数据 格式,请求接口,部分字段无法注入
    baomidou 动态数据源@DS 使用问题
    SpringMVC框架深入(八)--SpringMVC原理
    Spring框架深入(七)--json数据交互
    框架理论深入(六)--拦截器
    Spring框架深入(五)--文件上传和异常处理
    int和Integer的区别
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/11797437.html
Copyright © 2011-2022 走看看