美文网首页
文件描述符

文件描述符

作者: 追风骚年 | 来源:发表于2022-03-01 10:43 被阅读0次

    文件描述符是操作系统暴露给应用程序操作文件的句柄,Linux 称为 fd,windows 称 handle。

    文件重命名不影响文件的描述符。

    package main
    
    import (
        "fmt"
        "os"
        "strconv"
        "time"
    )
    
    func main() {
        fmt.Println("Getpid", os.Getpid())
    
        f, err := os.OpenFile("log.log", os.O_WRONLY|os.O_CREATE, 0777)
        defer f.Close()
        if err != nil {
            panic(err)
        }
    
        go func() {
            oldName := "log.log"
            for i := 0; i < 10; i++ {
                newName := oldName + "." + strconv.Itoa(i)
    
                _ = os.Rename(oldName, newName)
                oldName = newName
                time.Sleep(time.Second * 5)
            }
        }()
    
        for i := 0; i < 100; i++ {
            _, err = f.Write([]byte(strconv.Itoa(i) + "."))
            time.Sleep(time.Second)
        }
    }
    

    起一个 goroutine 五秒修改一下文件名,主 goroutine 不停的往文件中写入,不会因为文件名变化造成写入失败。

    有个项目中使用 seelog 写日志,貌似有点问题,偶尔不能自动切换文件,导致日志都写入到相同的文件中。


    不仅如此,在后续修改文件权限的情况下,也不影响,进程正在对打开的文件描述符进行写入操作,所以为了安全考虑应该在执行 exec 系统调用之前,将无关的文件描述符都关闭。

    相关文章

      网友评论

          本文标题:文件描述符

          本文链接:https://www.haomeiwen.com/subject/kfedrrtx.html