文件描述符

2022-03-01  本文已影响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 系统调用之前,将无关的文件描述符都关闭。

上一篇 下一篇

猜你喜欢

热点阅读