file write가 안되는 경우
-
문제의 코드
f, err := os.OpenFile("/tmp/test", os.Append, 0755) if err != nil { panic(err) } fmt.Fprintln(f, "test")
-
그러나 쓰기가 되지 않았고, fmt.Fprintln의 err을 확인했을때 아래의 오류가 나왔다.
bad file descriptor
-
O_APPEND는 access mode가 아니다.
The argument __flags__ must include one of the following __access modes__: **O_RDONLY**, **O_WRONLY**, or **O_RDWR**. These request opening the file read-only, write-only, or read/write, respectively.
- open 커맨드의 man에 따르자면, access mode는 세가지. O_RDONLY, O_WRONLY, O_RDWR인 듯 하다.
- 이 세개중 하나는 반드시 들어가야 한다.
-
각각의 플래그의 값은 이렇다.
O_RDONLY = 0x0 O_WRONLY = 0x1 O_RDWR = 0x2 O_APPEND = 0x8
- 따라서 O_APPEND만 사용하면
0x8
이 되는데, 첫번째 비트가 0이기 때문에,O_RDONLY
로 열리게 되는 것.
- 따라서 O_APPEND만 사용하면
-
추가로 golang에서 파일을 열 때 사용할 수 있는 플래그는 아래와 같다.
golang/src/os/file.go const ( // Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified. O_RDONLY int = syscall.O_RDONLY // open the file read-only. O_WRONLY int = syscall.O_WRONLY // open the file write-only. O_RDWR int = syscall.O_RDWR // open the file read-write. // The remaining values may be or'ed in to control behavior. O_APPEND int = syscall.O_APPEND // append data to the file when writing. O_CREATE int = syscall.O_CREAT // create a new file if none exists. O_EXCL int = syscall.O_EXCL // used with O_CREATE, file must not exist. O_SYNC int = syscall.O_SYNC // open for synchronous I/O. O_TRUNC int = syscall.O_TRUNC // truncate regular writable file when opened. )
- 확인해보니 주석으로도 세개중 하나를 반드시 사용하라고 되어 있다…