3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個贊
您需要添加O_WRONLY標(biāo)志:
if f, err := os.OpenFile("./log.log", os.O_APPEND|os.O_WRONLY, os.ModeAppend); err != nil { /*[...]*/ }
為了解釋一下,這里是 linux 文檔open:http : //man7.org/linux/man-pages/man2/openat.2.html:
參數(shù)標(biāo)志必須包括以下訪問模式之一:O_RDONLY、O_WRONLY 或 O_RDWR。這些請求分別以只讀、只寫或讀/寫方式打開文件。
如果您檢查/usr/local/go/src/syscall/zerrors_linux_amd64.go:660,您可以看到:
O_RDONLY = 0x0
O_RDWR = 0x2
O_WRONLY = 0x1
所以默認(rèn)情況下你會得到一個只讀的文件描述符。

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個贊
它對我有用
之前的代碼:
os.OpenFile(fileName, os.O_CREATE|os.O_APPEND, os.ModePerm)
它發(fā)生了錯誤:文件描述符錯誤,
然后我將 os.O_WRONLY 添加到函數(shù)中
之后的代碼:
os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
它沒有出現(xiàn)問題。

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個贊
這似乎是 windows 和 linux 之間的差異。在 windows 上 os.O_APPEND 意味著寫訪問,如 syscall_windows.go 中的代碼所示。
if mode&O_APPEND != 0 {
access &^= GENERIC_WRITE
access |= FILE_APPEND_DATA
}
在 linux 中,openflags 按原樣傳遞給 linux 系統(tǒng)調(diào)用
因此,在 DOS/WINDOWS 中,您不需要像暗示的那樣顯式添加帶有附加標(biāo)志的寫入標(biāo)志。(這是自 DOS 時代以來的默認(rèn)行為)Linux 中的 Go 確實(shí)需要添加額外的標(biāo)志才能工作。
(...但我不應(yīng)該需要這個標(biāo)志,因?yàn)楦郊与[含暗示我想寫。我應(yīng)該向 golang 報(bào)告這個錯誤嗎?)
- 3 回答
- 0 關(guān)注
- 206 瀏覽
添加回答
舉報(bào)