文件描述符是操作系统暴露给应用程序操作文件的句柄,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 系统调用之前,将无关的文件描述符都关闭。
网友评论