package system import ( "context" "errors" "os" "syscall" "time" ) // flock 对 fd 加排他锁,等待直至获得或 ctx 取消。 func flock(ctx context.Context, f *os.File) error { for { err := syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB) if err == nil { return nil } if !errors.Is(err, syscall.EWOULDBLOCK) { return err } select { case <-ctx.Done(): return ctx.Err() case <-time.After(50 * time.Millisecond): } } } // funlock 释放文件锁。 func funlock(f *os.File) { _ = syscall.Flock(int(f.Fd()), syscall.LOCK_UN) }