...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package fileutil
16
17 import (
18 "os"
19 "syscall"
20 "time"
21 )
22
23 func TryLockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) {
24 if err := os.Chmod(path, syscall.DMEXCL|PrivateFileMode); err != nil {
25 return nil, err
26 }
27 f, err := os.Open(path, flag, perm)
28 if err != nil {
29 return nil, ErrLocked
30 }
31 return &LockedFile{f}, nil
32 }
33
34 func LockFile(path string, flag int, perm os.FileMode) (*LockedFile, error) {
35 if err := os.Chmod(path, syscall.DMEXCL|PrivateFileMode); err != nil {
36 return nil, err
37 }
38 for {
39 f, err := os.OpenFile(path, flag, perm)
40 if err == nil {
41 return &LockedFile{f}, nil
42 }
43 time.Sleep(10 * time.Millisecond)
44 }
45 }
46
View as plain text