Linux ๋ฐ MacOS์์๋ ์ด๊ฒ์ ์์ฑํ ์ ์์ต๋๋ค. Windows์์๋ "๊ณต์ ์๋ฐ"์ผ๋ก ์คํจํฉ๋๋ค.
path := "delete-after-open"
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
if err != nil { ... }
err = os.Remove(path) // or os.Rename(path, path+"2")
if err != nil { ... }
fd.Close()
Windows์์ ๊ฐ๋ฐํ๊ณ Linux ๋ฑ์ ๋ฐฐํฌํ๊ณ ์ฝ๋๊ฐ os.Rename() & .Remove()์ _undocumented_ GOOS=windows ๋์์ ์์กดํ๋ ๊ฒฝ์ฐ ์์๋์ด ์ทจ์ฝํ ์ ์์ต๋๋ค. ํจํค์ง "os"์๋ ๋ค๋ฅธ Windows ๊ด๋ จ ๋์์ ๋ํ _15๊ฐ์ ์ธ๊ธ_์ด ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด https://golang.org/src/syscall/syscall_windows.go#L272 ์์ syscall.Open()
sharemode |= FILE_SHARE_DELETE
Microsoft ๋ ์ด๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค: https://github.com/golang/go/issues/32088#issuecomment -502850674
Rust๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ์ต๋๋ค. https://doc.rust-lang.org/std/os/windows/fs/trait.OpenOptionsExt.html
Mingw-w64 ๋ 7๋
์ ์ ์ด๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ์ต๋๋ค.
https://sourceforge.net/p/mingw-w64/code/HEAD/tree/stable/v3.x/mingw-w64-headers/include/ntdef.h#l858
Erlang ์ 6๋
์ ์ ๊ทธ๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ง๋ค์์ต๋๋ค: erlang/ otp@0e02f48
Python ์ MSVC ๋ฐํ์์ ์ ํ์ผ๋ก ์ธํด ์ด๋ฅผ ์ฑํํ ์ ์์ต๋๋ค: https://bugs.python.org/issue15244
~๋ฐ๋ผ์ syscall.Open()์ ๊ธฐ๋ณธ์ ์ผ๋ก file_share_delete๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ syscall์ ๋ค์ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ ๊ณตํด์ผ ํฉ๋๋ค.
a) ๋นํ์ฑํํ๊ธฐ ์ํ ์ ์ญ ์ค์์น(๋ถ์ฌ์ ์์กดํ๋ ๊ธฐ์กด ์ฑ์ ๊ฒฝ์ฐ)
b) ํน์ ํ์ผ ํธ๋ค์์ ๋นํ์ฑํํ๊ธฐ ์ํด os.OpenFile()๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํ ํ๋๊ทธ.~
@rsc์ https://github.com/golang/go/issues/32088#issuecomment-532784947 ์ดํ ์
๋ฐ์ดํธ:
a) os.Create/Open/OpenFile()์ Windows์์ ํญ์ file_share_delete ๋ฅผ
b) Windows์ syscall.Open()์ file_share_delete๋ฅผ ํ์ฑํํ๋ ํ๋๊ทธ๋ฅผ ์๋ฝํด์ผ ํฉ๋๋ค.
c) Windows์ syscall์ ์ ํ๋๊ทธ์ ๋ํ ์์๋ฅผ ๋ด๋ณด๋ด์ผ ํฉ๋๋ค.
os.Remove() ๋ฌธ์๋ Windows์์ ์ด๋ ค ์๋ ํ์ผ์ ์ญ์ ํ ํ ํ์ผ ์ด๋ฆ์ ์ฌ์ฌ์ฉํ๋ ค๋ฉด os.Rename(path, unique_path); os.Remove(unique_path)
์ํํด์ผ ํฉ๋๋ค.
Win API ๋ฌธ์
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-deletefilea
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea
์ด๊ฒ์ ํ์ง ์๋ ์ด์ ๊ฐ ์๋ค๋ฉด os.Remove() & .Rename()์ ๋ฌธ์ํํด์ผ ํฉ๋๋ค.
cc @alexbrainman
@gopherbot OS-Windows ์ถ๊ฐ
/cc @alexbrainman
https://golang.org/src/syscall/syscall_windows.go#L272์ syscall.Open()
sharemode := ... | FILE_SHARE_DELETE
์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ ๊ทธ๋์ผ ํฉ๋๊น?
์๋ ์ค
FILE_SHARE_DELETE๋ ์์ ์ฝ๋ ์์ ๋ฅผ ํ์ฑํํฉ๋๋ค. ์ด ์์ ๋ MacOS ๋ฐ Linux์์ ์๋ํ์ง๋ง Windows์์๋ ์คํจํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ํ์ํฉ๋๋ค.
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
defer fd.Close()
_, err = fd.Write(...)
err = fd.Sync() // file now safe to share
err = os.Rename(path, path+"2")
_, err = fd.Read(...)
FILE_SHARE_DELETE๋ ์์ ์ฝ๋ ์์ ๋ฅผ ํ์ฑํํฉ๋๋ค. ์ด ์์ ๋ MacOS ๋ฐ Linux์์ ์๋ํ์ง๋ง Windows์์๋ ์คํจํฉ๋๋ค.
๋์ MacOS ๋ฐ Linux ์ฝ๋๋ฅผ ์กฐ์ ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ํ์ํฉ๋๋ค.
๋ฌด์จ ๋ง์ ํ๋ ค๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
์๋ ์ค
@networkimprov Windows์์ Close() ํ์ Remove๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.
path := "delete-after-open"
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
if err != nil { panic(err) }
fd.Close()
err = os.Remove(path) // or os.Rename(path, path+"2")
if err != nil { panic(err) }
@alexbrainman ์ ๋ขฐํ ์ ์๋ ํ์ผ I/O๋ฅผ ์ํํ ๋(๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฝ์ฐ), ์์ ์ด๋ฆ์ผ๋ก ํ์ผ์ ๋ง๋ค๊ณ , ์ฐ๊ณ , fsyncํ๊ณ , ์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ์ด ํ์ค ๊ดํ์ ๋๋ค.
์ด๋ ค ์๋ ํ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก Unix์์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ํ Windows ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์ ๊ฒ์ ์ค์๋ก ๋ณด์ ๋๋ค. Go ํ์ด Linux ๋ฐ MacOS์์ ์๋ํ๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋๋ก ์ค๋ํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค :-)
@mattn pls๋ ๋ด๊ฐ ์ค๋ช ํ ์์ ์ฌํญ์ ์ ์ฉํ๊ณ ๋ด๊ฐ ๊ฒ์ํ ์ฝ๋๋ฅผ ์๋ํฉ๋๋ค.
Go ํ์ด Linux ๋ฐ MacOS์์ ์๋ํ๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋๋ก ์ค๋ํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค :-)
์ ๋ ์ง๊ธ ์ํฉ์ด ์ข์ต๋๋ค.
์๋ ์ค
Windows์์ ์ด ๊ณตํต ๊ธฐ๋ฅ์ ์๋ตํ ์ด์ ๊ฐ ์์ต๋๊น?
ํ๋ก๊ทธ๋จ ์์ ์ Unix ๋์์ ์ ํํ ์ ์๋๋ก syscall_windows.go์ ์ค์์น๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
์ API๋ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํด๋ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ํ์ฌ์ ํ๋์ ๋ฐ๊พธ๋ ๊ฒ์ ๋ฐ๋ํฉ๋๋ค. FILE_SHARE_DELETE๋ Unix ๋์๊ณผ ๋์ผํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
#include <windows.h>
#include <stdio.h>
int
main(int argc, char* argv[]) {
HANDLE h = CreateFile("test.txt",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
getchar();
char buf[256] = {0};
DWORD nread;
printf("%d\n", ReadFile(h, buf, 256, &nread, NULL));
printf("%s,%d\n", buf, nread);
return 0;
}
Windows์์ ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ณ test.exe
๋ก ์คํํด ๋ณด์ญ์์ค. ์ด ์ฑ์ด ํค๋ฅผ ๋๋ฅด๋ ๋์ ์ cmd.exe๋ฅผ ์ด๊ณ ๋ค์๊ณผ ๊ฐ์ด "test.txt"๋ฅผ ์ญ์ ํฉ๋๋ค.
ํ์ผ์ ์ญ์ ํ ์ ์์ง๋ง ํ๋ก์ธ์ค๊ฐ ์กด์ฌํ๋ ๋์์๋ ๋จ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์์๋๋ก ์ ์๋ํ์ง ์์ต๋๋ค.
๋๋ ํ ๋ฆฌ ํญ๋ชฉ์ด ์ ๊ฑฐ๋์ง ์์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
ํ์ผ์ ์ด๊ธฐ ์ํ ์ดํ์ CreateFile ํธ์ถ์ ERROR_ACCESS_DENIED์ ํจ๊ป ์คํจํฉ๋๋ค.
๊ทธ๋์ ๋๋ ๋น์ ์ ํ๋ฉด ๊ธฐ๋ก์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
์ด์จ๋ ๋ค์๊ณผ ๊ฐ์ ์ค์์น๊ฐ ์ข์ต๋๋ค.
syscall.OpenFileShareDelete = true
์ ์ ์ง์ฅ์์ ์ด๊ฒ์ ๋ฌผ๋ฆฐ ์ ์ด ์์์ ์ธ๊ธํ๊ณ ์ถ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๋ฆฌ๋:
f, err := os.Open(...)
if err != nil { ... }
defer f.Close()
// lots of code
if err := os.Rename(...); err != nil { ... }
์ฝ๋๋ ์ ๋์ค ๊ธฐ๋ฐ CI ํ๋ซํผ์์ ์ ์คํ๋์์ง๋ง Windows์์๋ ํญ๋ฐ์ ์ด์์ต๋๋ค.
์ด์ํ ๋ถ์์ฉ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ผ์ด ์ ๋๋ก ์๋ ํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
IIRC, ์ฐ๋ฆฌ๋ Unix ์๋ฏธ ์ฒด๊ณ์ ๋ ๋ฐ์ ํ๊ฒ ์ผ์นํ๋๋ก ๊ณผ๊ฑฐ์ GOOS=windows & plan9 ๋์์ ์ฝ๊ฐ ์กฐ์ ํ์ต๋๋ค. ์๋ฏธ ์ฒด๊ณ๊ฐ ์ถฉ๋ถํ ๊ฐ๊น๋ค๋ฉด ์ด๊ฒ์ ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ก ๋ง๋๋ ๊ฒ์ ๊บผ๋ฆฌ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ @mattn ์ ์๊ฒฌ์ ํ๋์ด ์ถฉ๋ถํ ๊ฐ๊น์ง ์์ ๊ฐ์น๊ฐ ์์ ์๋ ์๋ค๊ณ ์ ์ํฉ๋๋ค.
ํ์ง๋ง ๊ธ๋ก๋ฒ ์ต์ ์ ๋ณด๊ณ ์ถ์ง๋ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋๋ฒ๊น ์ ๋ชฝ์ฒ๋ผ ๋ณด์ ๋๋ค.
@๋ธ๋๋ํผ์ธ
์๋ง๋ ์๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ ๋ด ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค.
https://groups.google.com/forum/#!topic/golang -dev/R79TJAzsBfM
๋๋ ์ํ๋ ๊ฒฝ์ฐ ๊ฐ๋ฅํ ์๋ฃจ์
์ด ์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ด์ฉ์ ๋ณต์ฌํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ๋์์ผ๋ก ๊ตฌํํ์ง๋ ์๊ฒ ์ง๋ง ์ด๋ Windows ํ๋ก๊ทธ๋จ์ด ์๋ํ๋ ๋ฐฉ์๊ณผ ์ผ์นํ์ง ์๊ณ ์คํ๋ ค ์ ์ฌํ ๊ต์ฐจ๋ฅผ ์์ฑํ๊ธฐ ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. - os ๊ฒฝํ.
@guybrand ๋ golang-dev ์ค๋ ๋์ ๋ค์๊ณผ ๊ฐ์ด ์๋๋ค.
๋ด ํ๋ก๊ทธ๋จ์ "my.data"๋ผ๋ ํ์ผ์ ์์ฑํ ๋ค์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ํธ์ถํ๊ณ ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค... ์ด ํ๋ก๊ทธ๋จ์ 10์ด๊ฐ ์์๋๋ ์ด ํ์ผ์ ์ ๋ก๋ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค(์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ "์ ๋ก๋"๋ผ๊ณ ๋ถ๋ฅผ ์ ์์) .
...
๋ด ํ๋ก๊ทธ๋จ์ด Windows์์ .Remove๋ฅผ ํธ์ถํ ๋(FILE_SHARE_DELETE๊ฐ ์ผ์ ธ ์์):
...
์ ๋ก๋๋ ํ์ผ์ด ์ ๊ฑฐ๋์๋ค๋ ์ค๋ฅ๋ฅผ ์์ ํฉ๋๋ค(์๋ง๋ EOF).
"๋ด ํ๋ก๊ทธ๋จ"์ด os.Remove()๋ฅผ ํธ์ถํ๊ธฐ ์ ์ "์ ๋ก๋"๊ฐ ํ์ผ์ ์ฐ๋ค๊ณ ๊ฐ์ ํ๋ฉด Win API ๋ฌธ์์ ๋ชจ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
_DeleteFile์ ๋ซ์ ๋ ํ์ผ์ ์ญ์ ํ๋๋ก ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ผ์ ๋ํ ๋ง์ง๋ง ํธ๋ค์ด ๋ซํ ๋๊น์ง ํ์ผ ์ญ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ํ์ผ์ ์ด๊ธฐ ์ํ CreateFile์ ๋ํ ํ์ ํธ์ถ์ ERROR_ACCESS_DENIED._์ ํจ๊ป ์คํจํฉ๋๋ค.
๋ค์ "CreateFile์ _open_osfhandle()์ _fdopen์ ํ์ด๋ง"ํ ๋ ์์ ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๊น?
FILE_SHARE_DELETE๋ฅผ ์ถ๊ฐํ๋ฉด ๋ง์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค์๋ก Unix ๋์์ ์๋ฎฌ๋ ์ด์
ํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๊ฐ OS์ ๋ํ ๋น๋ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ๋ถ๋ฆฌ๋ ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ os.NewFile()
๋ฐํํด์ผ ํ๋ฉฐ Windows์์๋ FILE_SHARE_DELETE๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ฐ OS์ ๋ํ ๋น๋ ์ ์ฝ์ผ๋ก ๋ถ๋ฆฌ๋ ํจ์๋ฅผ ๋ง๋ญ๋๋ค... os.NewFile()์ ๋ฐํํ๊ณ Windows์์ FILE_SHARE_DELETE๋ฅผ ์ฌ์ฉํฉ๋๋ค.
os.OpenFile()์ ๊ธฐ๋ฅ์ ์ ์งํ๋ ค๋ฉด ์ด ๊ณํ์์ ๋ค์์ ๋ชจ๋ ๋ค์ ๊ตฌํํด์ผ ํฉ๋๋ค.
os.OpenFile()
openFileNolog()
ํ์ผ ์ด๊ธฐ()
openDir()
์๋ก์ด ํ์ผ()
FixLongPath()
syscall.Open()
makeInheritSa()
@networkimprov
@guybrand ๋ golang-dev ์ค๋ ๋์ ๋ค์๊ณผ ๊ฐ์ด ์๋๋ค.
๋ด ํ๋ก๊ทธ๋จ์ "my.data"๋ผ๋ ํ์ผ์ ์์ฑํ ๋ค์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ํธ์ถํ๊ณ ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค... ์ด ํ๋ก๊ทธ๋จ์ 10์ด๊ฐ ์์๋๋ ์ด ํ์ผ์ ์ ๋ก๋ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค(์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ "์ ๋ก๋"๋ผ๊ณ ๋ถ๋ฅผ ์ ์์) .
...
๋ด ํ๋ก๊ทธ๋จ์ด Windows์์ .Remove๋ฅผ ํธ์ถํ ๋(FILE_SHARE_DELETE๊ฐ ์ผ์ ธ ์์):
...
์ ๋ก๋๋ ํ์ผ์ด ์ ๊ฑฐ๋์๋ค๋ ์ค๋ฅ๋ฅผ ์์ ํฉ๋๋ค(์๋ง๋ EOF)."๋ด ํ๋ก๊ทธ๋จ"์ด os.Remove()๋ฅผ ํธ์ถํ๊ธฐ ์ ์ "์ ๋ก๋"๊ฐ ํ์ผ์ ์ฐ๋ค๊ณ ๊ฐ์ ํ๋ฉด Win API ๋ฌธ์์ ๋ชจ์๋์ง ์์ต๋๊น?
DeleteFile์ ํ์ผ์ ๋ซ์ ๋ ์ญ์ ํ ํ์ผ์ ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ผ์ ๋ํ ๋ง์ง๋ง ํธ๋ค์ด ๋ซํ ๋๊น์ง ํ์ผ ์ญ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ํ์ผ์ ์ด๊ธฐ ์ํ ์ดํ์ CreateFile ํธ์ถ์ ERROR_ACCESS_DENIED์ ํจ๊ป ์คํจํฉ๋๋ค.
๋ค์ "CreateFile์ _open_osfhandle()์ _fdopen์ ํ์ด๋ง"ํ ๋ ์์ ์ฝ๋๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๊น?
WINdows API์ ๋ชจ์์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ์์ฒ๋ผ ๋ณด์ด๋ ๋ถ๋ถ์ ์ง์ ํด ์ฃผ์ญ์์ค.
์ฝ๋ ์ํ์ ๊ดํด์๋ ์ฝ๊ฐ์ Google ๊ฒ์์ ์ํํ์ฌ ๋ค์์ ์ฐพ์์ต๋๋ค.
http://blog.httrack.com/blog/2013/10/05/creating-deletable-and-movable-files-on-windows/
ํ์ง๋ง
์ฐธ๊ณ - ์ด๊ฒ์ ๋ด๋ถ์ ์ผ๋ก๋ง nix์ ๊ฐ์ ๋์์ ์ ๊ณตํ๋ฉฐ, ์ด์ ํจ๊ป ์๋ํ๋ ๋ค๋ฅธ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ์ด๋ฅผ ์ค๋จํฉ๋๋ค(ํ์ค Windows API๋ฅผ ์ฌ์ฉํ๋ 99%
@networkimprov
"์ด๊ฒ์ด "dir my.data"์ฒ๋ผ ๋ค๋ฆฌ๋ฉด ํ์ผ์ด ํ์๋ฉ๋๋ค. ์ ๊ฐ ๊ธฐ์ตํ๋ ํ ์ด๊ฒ์ Windows .... XP ๋๋ 7(์ด๋ ๊ฒ์ด ๊ธฐ์ต๋์ง ์์) ์ดํ๋ก ๋ณ๊ฒฝ๋๊ณ (์ด์ฉ๋ฉด ํ์๊ธฐ๊ฐ ์จ๊ธธ ๋๊น์ง) ๋์์ด์์ต๋๋ค. ์ด๋ป๊ฒ๋ ) - ๋ค์์ Windows ํ๊ฒฝ์ ์์ํ ๋ ๋ค์ ํ
์คํธํ ์ ์์ต๋๋ค.(๋ช ์ฃผ์ ํ ๋ฒ ๋ฐ์ํฉ๋๋ค...)
"์ด๊ฒ์ด ํ์ผ์ ๋ํ ํธ๋ค์ด ์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ฌ์ ํ ํ์ผ์ ์ฝ๊ณ ์ธ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฐ๋ค"๋ ์๋ฏธ์ธ ๊ฒฝ์ฐ "EOF" ์คํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ด๋ฌํ ํ์ผ์ ๋ํ ์ฐ๊ธฐ๋ฅผ ์ฝ๋ ๋ ๋ฒ์งธ๋ก ์ ์ฌ์ ๋จน๊ฒ ๋ ๊ฒ์ ๋๋ค. - ํ์ง๋ง ๋ค์ 100% ๊ธ์ ์ ์ธ์ง ํ์ธํด์ผ ํฉ๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ ๋ด ์์ ์ (์ด ์์ ์์ "๊ธฐ๋ณธ ์ ์ฌ" ๋ " os-agnostic" ์ง์ ์์ "์ธก๋ฉด"์ ์ทจํ๊ณ ์์) - _fdopen ์คํ์ผ ์๋ฃจ์ ์ ๊ตฌํํ๋๋ผ๋ ์๋น์ค์ ๊ณต๋ ์์ ํ๋ ๋ค๋ฅธ ๋ชจ๋ ์คํ ํ์ผ์ด๋ฏ๋ก ๋ค๋ฅธ go ์คํ ํ์ผ(๋๋ fd๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๋๋ฌธ ์๋น์ค)๊ณผ๋ง ์ํธ ์์ฉํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ง๋ก ํ๋ฉด - ๋น์ ์ ์ฑ์ ๋ค๋ฅธ ์ด๋ค ์์ด๋ ์ดํดํ ์ ์๋ "๋ฐ์์ ๊ฐ์ฅ ๋๋ํ ์์ด"๊ฐ ๋ ๊ฒ์
๋๋ค.
๋ด๊ฐ ์๊ฐํ ์์๋ ๋ง์ ๋ ๊ฐ์ง ์ :
์
๋ ฅ :
๋ด ์ฑ์ด ํ์ผ์ ๋ค์ด๋ก๋ํ๊ณ , ๋ฐ์ด๋ฌ์ค ๋ฐฑ์ ์ด ํ์ผ์ ์๋ณํ๊ณ fd๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ์ ์ญ์ /๊ฒฉ๋ฆฌ(==์ด๋ฆ ๋ณ๊ฒฝ์ ์ผ์ข
)ํฉ๋๋ค. ๋ฐ์ด๋ฌ์ค์ ๊ฑธ๋ฆฌ๋ค๋...)
์ถ๋ ฅ :
๋ด ์ฑ์ ํ์ผ์ ๋ค๋ฅธ("์
๋ก๋"์ ๊ฐ์) ์๋น์ค๋ก ํ์ดํํ๊ณ ์ญ์ ํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๊ท์ฐฎ๊ฒ ํ
์คํฐ๋ฅผ ์์ฑํ๊ธฐ๋ ํ์ต๋๋ค. ํ
์คํธ๋ ํต๊ณผํ์ต๋๋ค.
์ด์ go test ๋์ filezilla๋ฅผ ์ฌ์ฉํ๊ณ , dropbx API๋ฅผ ์ ์กํ๊ณ , ๋ฌด์์ด๋
๋ด ํ
์คํธ๊ฐ ์๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์คํจํ๊ฑฐ๋ ์๋ํ์ง ์์ ๊ฒ์
๋๋ค ...
์ด๊ฒ์ ๊ธฐ๋ณธ ๋์์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ฌ์ ํ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?
Windows์์ ์ด ๊ณตํต ๊ธฐ๋ฅ์ ์๋ตํ ์ด์ ๊ฐ ์์ต๋๊น?
๋๋ ๊ทธ ์ง๋ฌธ์ ์๊ฐํด ๋ณธ ์ ์ด ์๋ค. ๋ชจ๋ฅด๊ฒ ์ด์.
Windows์์ Go ํ์ผ์ด ์๋ํ๋ ๋ฐฉ์์ ๋ด ์ธ์์์ ์ฌ์ฉํ ๋ค๋ฅธ ๋ชจ๋ ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ผ์นํฉ๋๋ค. Go ํ์ผ์ด ๋น์ ์ด ์ ์ํ ๋๋ก ์๋ํ๋ค๋ฉด ๊ทธ๊ฒ์ ๋์๊ฒ ๋๋ผ์ด ์ผ์ด ๋ ๊ฒ์ ๋๋ค. ๋๋ ๋ํ ๊ทธ๊ฒ์ด ๋ง์ ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ๊นจ๋จ๋ฆด ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์๋ ์ค
๋๋ ๋ํ ๊ทธ๊ฒ์ด ๋ง์ ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ๊นจ๋จ๋ฆด ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@alexbrainman ๋ํ ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋์ ํ์ฑํํ๋ ์ค์์น๋ฅผ ์ ์ํ์ต๋๋ค.
@bradfitz syscall.SocketDisableIPv6์ด ์์ต๋๋ค. ์ด๋ syscall.Open() ๋์์ ์กฐ์ ํ๋ ํ๋๊ทธ์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
syscall_windows*.go ์ํ ์ดํ
func Open(๊ฒฝ๋ก ๋ฌธ์์ด, ๋ชจ๋ int, perm uint32) (fd ํธ๋ค, ์ค๋ฅ ์ค๋ฅ) {
....
๊ณต์ ๋ชจ๋ := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
๊ทธ๋ฆฌ๊ณ type_windows*.go๋
FILE_SHARE_DELETE = 0x00000004
๋ชจ๋ ๊ฒ์ด ์ค๋น๋์์ต๋๋ค. ์ ์ผํ ์ง๋ฌธ์ ํ๋๊ทธ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋๋ ์ ์ญ ์ต์
๊ณผ ๋ช
์์ ์ด์ง ์์ ๊ฒ์ ์ข์ํ์ง ์์ผ๋ฉฐ, ํ ๋ช
์ ๊ฐ๋ฐ์๊ฐ os.DeleteUponLastHandleClosed = 1๋ก ์ค์ ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ ์ ์์ง๋ง ์ฅ๊ธฐ๊ฐ ๋๋ ์ฌ๋ฌ ๊ฐ๋ฐ์์๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
๋ค๋ฅธ ์ต์
์ ๋ค์๊ณผ ๊ฐ์ด ํ๋๊ทธ์ ๋ํด ํน์ ์์ฝ ๋ฒํธ๋ฅผ ์ค์ ํ๋ ๊ฒ์
๋๋ค.
fd, ์ค๋ฅ := os.OpenFile(๊ฒฝ๋ก, os.O_RDWR|os.O_CREATE|os.DELETE_WHEN_FREED, 0600)
DELETE_WHEN_FREED๋ env์ ๊ฒฝ์ฐ 0์ด ๋ ์๋ ์์ต๋๋ค. ์๋์ฐ ์ธ,
๋ ๋ค๋ฅธ ์ต์
์ Windows์์ ์ง์๋์ง ์๋ perm ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ฏ๋ก ์ฝ๊ฐ ์ด์ํ ์ ์์ต๋๋ค.
fd, ์ค๋ฅ := os.OpenFile(๊ฒฝ๋ก, os.O_RDWR|os.O_CREATE, 777)
777์ ์์ฝ๋์ด ์์ผ๋ฏ๋ก ๋ ์์คํ
์ ๋ชจ๋ ์ง์ํ๋ 1777 ๋๋ -777์ด ํ์ํฉ๋๋ค.
์ฝ์ ์ ์๋ DELETE_WHEN_FREED | 777
๋ด๊ฐ ์๊ฐํ ์์๋ ๋ง์ง๋ง ์ต์
์ os.OpenDeletableFile(
nix์ os.OpenFile๊ณผ
ํ์ ํ๋ค
๊ณต์ ๋ชจ๋ := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)
์ฐฝ๋ฌธ์
์์ ๋ชจ๋ ์๋ฃจ์ ์ ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ํ ์คํธํ๋ ๋ฐ ์๊ฐ์ด ์กฐ๊ธ ๋ ๊ฑธ๋ฆฌ๋ฉฐ(OS ๊ฐ) ์ ๊ถ์๋ง ์์ผ๋ฉด ๋ฉ๋๋ค...
๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋ API ํ๋ฉด์ ํ์ฅํ์ง ์๊ณ ์ด ๋์์ ์ง์ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ Windows์์ os.OpenFile
์ flag
๋งค๊ฐ๋ณ์์์ syscall.FILE_SHARE_DELETE
๋ฅผ ์๋ฝํ๊ณ ์ด๋ฅผ ๊ณ์ฐ๋ sharemode
๊ฐ. Windows์ syscall.O_*
(๋ฐ๋ผ์ os.O_*
) ํ๋๊ทธ๋ ์ด์จ๋ ๊ตฌ์ฑ๋ ๊ฐ์ ์ฌ์ฉ ํ๋ฏ๋ก ํฌํจํ๋ ค๋ Windows ๊ด๋ จ ํ๋๊ทธ์ ์ถฉ๋ํ์ง ์๋๋ก ์ค๊ณํ ์ ์์ต๋๋ค. ๋คํํ๋ ์ด๋ฏธ syscall.FILE_SHARE_DELETE
์์ ์ถฉ๋์ ํผํ๊ณ ์์ต๋๋ค.
์ด์จ๋ ์ ๋ ๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ๋ ฅํ ๋ฐ๋ํฉ๋๋ค. FILE_SHARE_DELETE
๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ฉด ๋ ์ด์ค ์๋ ํ์ผ ์์คํ
์ํ๋ฅผ ๋ณด์ฅํ ์ ์๋ค๋ ์ ์์ POSIX ์์คํ
๊ณผ ๊ฐ์ ์์น์ ๋์ด๊ฒ ๋ฉ๋๋ค. ์ด ํ๋๊ทธ๋ฅผ ์ ํ ์ฌํญ์ผ๋ก ํ๋ ๊ฒ์ Windows์์ openat
, renameat
, readlinkat
๋ฑ๊ณผ ๋๋ฑํ ๊ฒ์ด ํ์ํ์ง ์์ ์ด์ ์
๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ํด์ผ ํ๋์ง์ ๋ํด ๊น์ด ์๊ฐํ์ง ์์์ง๋ง ํ ๊ฐ์ง๋ง ๋ถ๋ช ํ ํ๊ณ ์ถ์ต๋๋ค.
ํ๋ก๊ทธ๋จ ์์ ์ Unix ๋์์ ์ ํํ ์ ์๋๋ก syscall_windows.go์ ์ค์์น๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ํ์ง ์์ ๊ฒ์ ๋๋ค. ์ด๋ ๋จ์ผ ํ๋ก๊ทธ๋จ์ด ๋ค๋ฅธ ๋์์ ์์ํ๋ ๋ค๋ฅธ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
@havoc-io
๊ทํ์ ์ ์์ syscall.FILE_SHARE_DELETE๊ฐ POSIX ํ์ค ๋์๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ํ๋ก๊ทธ๋จ์ ์์ฑํ ๊ฒ์
๋๋ค.
syscall_windows*.go์ ์์ฑ์๋ FILE_SHARE_DELETE ํ๋๊ทธ(๊ฑฐ๊ธฐ์ ์์)๋ฅผ ์๊ณ ์์๊ณ ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํธ๋๋ ๋์์ด ์๋๋ผ๊ณ ๊ฒฐ์ ํ์ต๋๋ค.
์์?
Liam์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ฒ ์ต๋๋ค.
fd.Close() ์ฐ๊ธฐ
์ญ์ /์ด๋ฆ ๋ณ๊ฒฝ
๊ทธ๋ฐ ๋ค์ ์ฝ๊ธฐ/์ฐ๊ธฐ
๊ทธ๋์ ์ค์ ์ ๋ ฌ ์์๋
์ด๋ ค์๋
์ญ์ ๋ ๊ฒ์ผ๋ก ํ์
์ฝ๊ธฐ/์ฐ๊ธฐ(์๋ง๋ ๊ต์ฐจ ํ๋ก์ธ์ค/๊ต์ฐจ ์ด๋ ๋ฃจํด ์ฝ๊ธฐ ์ฐ๊ธฐ)
๋ซ๋ค
ํ์ฌ Windows ๋์์ ๊ฐ๋ฐ์์๊ฒ "์ด๊ฒ์ ์๋ชป๋์์ต๋๋ค"๋ผ๊ณ ๊ฒฝ๊ณ ํ๋ฉฐ ๊ฐ๋ฐ์๋ ์ญ์ ๋ฅผ ์ฐ๊ธฐํ ์๋ ์์ต๋๋ค.
FILE_SHARE_DELETE๋ฅผ ์ถ๊ฐํ๋ฉด ์ฐฝ์์ "ํ์ผ์ด ์ด๋ ค ์์ด๋ ์ญ์ ๋ก ํ์"ํ ์ ์์ง๋ง ์ญ์ ์ ๋ซ๊ธฐ ์ฌ์ด์ ํ์ผ์ ์ก์ธ์คํ๋ ค๊ณ ์๋ํ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค/๊ณ ๋ฃจํด์ด ๋์์ ์คํ๋ฉ๋๋ค(์ด ์ฝ๋์์ ์๋ง๋ ๋ ๊ธด ์์
์ผ ๊ฒ์
๋๋ค) ) ์คํจํ ๊ฒ์ด๋ค
๊ฒฐ๊ณผ: ์ผ๊ด๋ "ํ ์ ์์ต๋๋ค" ๋์ ๋์ "๊ฐ๋ - ํนํ ๋์ ์ฌ์ฉ์๊ฐ ๋ง์ ๋ ์คํจํ๊ณ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ฐ๋ผ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์๊ณ ๊ฐ๋ฐ์๊ฐ "ํ ๋ฒ๋ง ์คํ"ํ๋ ํน์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋ด ํฌํ๋ ๋ฌผ๋ก ์ผ๊ด๋ ํ๋์ ๋ํ ๊ฒ์
๋๋ค ...
Posix์ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์?
์ญ์ ๋ ๊ฒ์ผ๋ก ํ์๋ ํ์ผ์ ๋ ์ด์ ํ์ผ ํ
์ด๋ธ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ๋ฃจํด/ํ๋ก์ธ์ค๊ฐ ๋์ผํ ์ด๋ฆ์ ํ์ผ์ ์์ฑํ ์ ์๋๋ก fd๋ก๋ง ์กด์ฌํฉ๋๋ค.
go ๋ด์์ ํด๊ฒฐํ ์ ์๋ ์ฐจ์ด์ ์ด ์์ผ๋ฏ๋ก "๋์ผํ ์๋ฃจ์ "์ ์ฐพ๋ ๊ฒ์ ์ค๋จํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค(๋์๋ฌธ์ ๊ตฌ๋ถ ํ์ผ ์ด๋ฆ? :) Linux 5.2์์ ๊ทธ๋ ๊ฒ ํ๋๋ก ํ ๊ฒ์ ๋๋ค...)
์ ์ฒด์ ์ผ๋ก ์์ ํ์ผ์ ๋ํ ์๋ฃจ์ ์ ์ฐพ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด Windows๋ "์ฌ์ฉํ ๋ค์ ํด์งํต์ ๋ฒ๋ฆฌ๋" ํ์ผ์ ๋ํ ํ์ค ์๋ฃจ์ ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์๋ GetTempFileName์ ์ง์ํฉ๋๋ค.
๋ฐ๋ฉด์ ๊ฐ๋ฐ์๊ฐ ์ฐฝ์์ ์ญ์ ๋ฅผ ์ฐ๊ธฐํ๋๋ก ํ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๊ฐ๋ฅํฉ๋๋ค. ์์ ์ ์์ ์ฐธ์กฐํ์ธ์. ๊ทธ๋ฌ๋ ๊ฐ๋ฐ์ ๋ ์ด์ ๋ํ ์ฑ ์์ ์ง๊ณ ์์์ ์ดํดํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ข์ ์ด๋ฆ ๊ท์น์ด ์๋ ํ๋๊ทธ์ฌ์ผ ํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ฃผ์ ์ฉ๋๋ ์ด๋ฆฐ ํ์ผ์ ๋ง๋ ํ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ์ ๋๋ค.
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
_, err = fd.Write(...)
err = fd.Sync() // file now safe to share
err = os.Rename(path, shared_path)
// os.Close() at program exit
๋๋ ๋น์ ์ด os.O_WRNDEL ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ง ์๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ญ์ ๋ ํ์ผ์ ๋๋ ํ ๋ฆฌ์ ๋จ์ ์์ง๋ง os.Close() ์ ๊น์ง๋ ์ด ์ ์์ต๋๋ค. ๋ํ ํ์ผ์ ์ญ์ ํ๊ธฐ ์ ์ ์์ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ๋ฉด Unix์ ์ ์ฌํ ๋์์ด ๋ ๋ง์ด ์ ๊ณต๋๋ค๋ ์ ์ ์ธ๊ธํ์ญ์์ค.
@guybrand ์ ์ ์์ ์คํดํ๊ณ FILE_SHARE_DELETE
๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด์ผ ํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ์ด ์๋๋๋ค. ์ฌ์ค ์ ๋ ์ ์๊ฒฌ์ ๋ ๋ฒ์งธ ๋จ๋ฝ์์ ์ธ๊ธํ ์ด์ ๋ก ๋ฐ๋ํฉ๋๋ค. ๋ด ์ ์์ os
ํจํค์ง์ ํ์ผ ์ธํ๋ผ๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ฉด์ ์ฌ์ฉ์๊ฐ FILE_SHARE_DELETE
๋์(ํ์ผ๋ณ๋ก)์ ์ ํํ ์ ์๋๋ก ํ๋ ๋ฉ์ปค๋์ฆ์ด์์ต๋๋ค. ์ด ์ ์์ ํจํค์ง์ API ํ๋ฉด์ ํ์ฅํ์ง ์๊ณ ๊ทธ๋ ๊ฒ ํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
os.O_WRNDEL ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ง ์๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค(Windows ์ด๋ฆ ๋ฐ๊พธ๊ธฐ/์ญ์ , ๋ค๋ฅธ ํ๋ซํผ์์๋ ์๋ํ์ง ์์)
@networkimprov ์์ ํ ์ ํจํ ํ๋๊ทธ๊ฐ ์ด๋ฏธ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ ํ๋๊ทธ๋ฅผ ์ ์ํ ํ์๊ฐ ์๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ๋ณธ์ง์ ์ผ๋ก syscall.FILE_SHARE_DELETE
์
๋๋ค. ์ ์ผํ ๊ตฌํ ๋ณ๊ฒฝ ์ฌํญ์ Windows์ syscall.Open
์์ ์ด ํ๋๊ทธ๋ฅผ ๊ฐ์ํ๊ณ syscall.O_*
/ os.O_*
ํ๋๊ทธ์ ๋ํ ํฅํ ์ถ๊ฐ ํญ๋ชฉ์ด ์ด ํ๋๊ทธ์ ์ถฉ๋ํ์ง ์๋๋ก ํ์ธํ๋ ๊ฒ์
๋๋ค. os.OpenFile
๋ํ ๋ฌธ์๋ Windows์์ ์ด ํ๋๊ทธ์ ์๋ฝ์ ๋ฐ์ํ๋๋ก ์
๋ฐ์ดํธ๋ ์ ์์ต๋๋ค.
@havoc-io ์คํดํด์ ์ฃ์กํฉ๋๋ค. ๋ค์์์ ๋ฐ์ทํ ๋ด์ฉ์
๋๋ค.
" ... syscall.FILE_SHARE_DELETE ...๋ฅผ ๊ณ์ฐ๋ ๊ณต์ ๋ชจ๋๋ก ์๋ฝํ๋ ค๋ฉด..."
os.O_WRNDEL์ ์ถ๊ฐํ๋ฉด "๋์์ด ๋ฌด์์ธ์ง"์ ๊ด๋ จํ์ฌ ๊ฐ๋ฐ์์๊ฒ ์ถฉ๋ถํ ๋ช ์์ ์ด์ง ์๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ๋ ๋ฒ์งธ ์ ์๊ณผ ์ผ์นํฉ๋๋ค. ์๋ง๋ os.WADRNDEL - Windows์์ ์ง์ฐ๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ/์ญ์ ํ์ฉ) .
@alexbrainman ๋ํ ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํ๋ ๋์ ํ์ฑํํ๋ ์ค์์น๋ฅผ ์ ์ํ์ต๋๋ค.
๊ด์ฌ ์์ด. ๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
์ด๋ ค ์๋ ํ์ผ์ @guybrand ์ด๋ฆ ๋ณ๊ฒฝ์ด ์ง์ฐ๋์ง ์๋์ง ํ์ธํ์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ์ ์ ์ฌํญ์ด ๋ฌด์์ธ์ง ๋ค์ ๋ฌป์ต๋๋ค. ์ฌ๋ ํ์ผ์ ์ญ์ ํ์๊ฒ ์ต๋๊น? ์ฌ๋ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ์๊ฒ ์ต๋๊น? ๋ ๋ค?
์ฐ๋ฆฌ ์ค 3๋ช ์ด ์ง๊ธ ์ ๊น๋ฐ์ ์ ์ํ๊ณ ์์ต๋๋ค. ์:
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE| os._WRNDEL, 0600)
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE| syscall.FILE_SHARE_DELETE, 0600)
์ฐ๋ฆฌ ์ค ์ธ ๋ช ์ด ์ง๊ธ ์ ๊น๋ฐ์ ์ ์ํ๊ณ ์์ต๋๋ค
์๋ก์ด ํ๋๊ทธ, ํนํ ์ฝ๋๋ฅผ ์ฝ๋ ๋๊ตฐ๊ฐ๊ฐ ์ฝ๊ฒ ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์๋ ํ๋๊ทธ๋ ๋ถ์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. syscall.FILE_SHARE_DELETE
์ฌ์ฉํ๋ฉด ํ๋ซํผ์ ํน์ ํ ์ผ์ด ์ผ์ด๋๊ณ ์์์ ๋
์์๊ฒ ์ฆ์ ์๋ฆด ์ ์์ด ํจ์ฌ ๋ ๋ช
ํํ๊ณ ๋ช
ํํด์ง๋๋ค.
์ด๊ฒ์ POSIX ํ๋ซํผ์์ ์ด๋ฏธ ํ์ฉ๋ฉ๋๋ค. os
ํจํค์ง์ ํตํฉ๋์ง ์์ ๋ง์ POSIX ํน์ (๋ฐ ํ๋ซํผ๋ณ) open
ํ๋๊ทธ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Darwin์ O_EVTONLY
ํ๋๊ทธ๋ฅผ ์ง์ํ๊ธฐ ์ํด os._DEVTONLY
์ ๊ฐ์ ๊ฒ์ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. syscall
ํจํค์ง์์ os.OpenFile
์ง์ ํ๋๊ทธ๋ฅผ ์ ๋ฌํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค
os.OpenFile(..., os.O_RDONLY | syscall.O_EVTONLY, ...)
์ด ๊ฒฝ์ฐ ํ๋ซํผ๋ณ ํ๋๊ทธ๋ ๊ธฐ๋ณธ open
์์คํ
ํธ์ถ๋ก ์ ๋ฌ๋ฉ๋๋ค.
FILE_SHARE_DELETE
ํ๋์ด ์ฌ๋๋ค์๊ฒ ์ง์ ์ผ๋ก ํ์ํ ๊ฒ์ด๋ผ๋ฉด ๋๋ต์ ๋จ์ํ os.OpenFile
๊ฐ Windows์์ ๊ธฐ๋ณธ CreateFileW
ํธ์ถ๊น์ง ํ๋๊ทธ๋ฅผ ์ ์ฌํ๊ฒ ์ค๋ ๋ํ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค. ์ ์ด๋ FILE_SHARE_DELETE
.
์์ ๊ตฌํ์ ์ฌ๊ธฐ ์์ ์ฐพ์ ์
@networkimprov
์ฐ๋ฆฌ ์ค 3๋ช ์ด ์ง๊ธ ์ ๊น๋ฐ์ ์ ์ํ๊ณ ์์ต๋๋ค. ์:
๊น๋ฐ์ ์ด๋ป๊ฒ ์์ํ์ญ๋๊น?
์ด๋ ค ์๋ ํ์ผ์ @guybrand ์ด๋ฆ ๋ณ๊ฒฝ์ด ์ง์ฐ๋์ง ์๋์ง ํ์ธํ์ต๋๋ค.
๋ง์ต๋๋ค. ํ์ง๋ง ํ์ผ์ด ์ด๋ ค ์๋ ๋์ ํ์ฉํ๋ ค๋ฉด ๋ ๋ค FILE_SHARE_DELETE๊ฐ ํ์ํฉ๋๋ค.
๋ด ์ ์๋ ์ฉ์ด๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ํ ์ ์์ต๋๋ค
os.WARNDFDEL - Windows์์ ์ด๋ฆ ๋ณ๊ฒฝ์ ํ์ฉํ๊ณ ์ญ์ ์ฐ๊ธฐ๊ฐ ๋๋ฌด ๊น๋๋ค. WINDOWS_ALLOW_OPENNED_FILE_RENAME_OR_DEFFERED_DELETE์์ ์ฝ์ด๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
๋ ๋์ IMO์
๋๋ค.
@guybrand ๋๋ ์ด๊ฒ์ ๋ํ ์๋ฒฝํ๊ฒ ์ข์ ํ๋๊ทธ๊ฐ ์์ญ ๋
๋์ ์ฃผ๋ณ์ os
ํจํค์ง์ ๋ณต์กํ ์ด๋ฆ๊ณผ ๋ถํฌ๋ช
ํ ๋์์ ๊ฐ์ง ์๋ก์ด ํ๋ซํผ๋ณ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฐ์น๋ฅผ ์ค์ ๋ก ๋ณด์ง ๋ชปํฉ๋๋ค( FILE_SHARE_DELETE
). syscall.FILE_SHARE_DELETE
๋ฅผ ํ๋๊ทธ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋ช
ํํ๊ณ ๋ช
์์ ์
๋๋ค. ์์์ ์ธ๊ธํ๋ฏ์ด os
ํจํค์ง์ ์ถ๊ฐ๋์ง ์์์ง๋ง ์ฌ์ ํ ํ์ฉ๋๋ POSIX ๊ด๋ จ ๋ฐ ํ๋ซํผ๋ณ ํ๋๊ทธ๊ฐ ๋ง์ด ์์ต๋๋ค.
syscall.FILE_SHARE_DELETE๋ ์ฐฝ ์ ์ฉ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ณณ์์๋ ๊ธ์ง๋ ๊ฒ์ด ํ์ํฉ๋๋ค. ์๋ง๋ WIN ๋๋ WINDOWS ์ ๋์ฌ์ ํจ๊ป pkg os์ ๋ํ๋์ผ ํฉ๋๊น?
@mattn pls๋ ์์ @
์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ณณ์์๋ ๊ธ์ง๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
@networkimprov ํ๋๊ทธ๋ ๋ค๋ฅธ ๊ณณ์ ์กด์ฌํ ํ์๊ฐ ์์ต๋๋ค. Windows ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import (
"syscall"
"os"
)
file, err := os.OpenFile(..., os.O_RDWR | syscall.FILE_SHARE_DELETE, ...)
์, ์ด ์ฝ๋๋ ํ๋ซํผ์์ ๊ฒ์ดํธ๋์ด์ผ ํ์ง๋ง ์ด ํ๋๊ทธ์ ๋์์ POSIX ์์คํ
์ ๋์๊ณผ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ๊ทธ๋ ๊ฒ ํด์ผ ํ ๊ฒ์
๋๋ค. ๋น์ ์ด ๋ชจ๋ ํ๋ซํผ์์ ๋์ผํ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์ ํธ์๋ฅผํ๋ ค๋ ๊ฒฝ์ฐ์๋ (๊ฐ์ผ๋ก ์์ ์ ์์๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค syscall.FILE_SHARE_DELETE
Windows์์์ 0
์ ํจ์ค ๋น Windows ์์คํ
) os.OpenFile
. os
ํจํค์ง์ ์ผ๋ถ๊ฐ ์๋ ํ๋ซํผ๋ณ O_*
ํ๋๊ทธ๋ฅผ ๊ฐ์ ธ์ค๋ ค๋ ๊ฒฝ์ฐ(์: Darwin์ ๊ฒฝ์ฐ O_EVTONLY
๋๋ Linux์ ๊ฒฝ์ฐ O_ASYNC
).
์ฝ๋๋ฅผ ์์ฑํ ๋ ํฌ๋ก์ค ํ๋ซํผ์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. FILE_SHARE_DELETE๋ syscall_*์ ์กด์ฌํ์ง ์์ต๋๋ค. Windows ํ๋๋ฟ์ ๋๋ค(๋ฐ๋ผ์ anf๋ ๋ค๋ฅธ ์์คํ ์์ ์ปดํ์ผ๋์ง ์์ต๋๋ค).
0x4 const๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๊น?
FILE_SHARE_DELETE = 0x00000004
๋ชป์๊ธด๊ฑฐ ๋นผ๊ณ ๋
netbsd_arm
O_NDELAY = 0x4
O_NONBLOCK = 0x4
๋ฐ๋ผ์ 0x4๋ฅผ ์ฌ์ฉํ๋ฉด netbsd_arm์์ ๋ค๋ฅด๊ฒ ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ํ๋ซํผ์ FILE_SHARE_DELETE๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ Windows ํ๋ซํผ์ 0x4, ๋ค๋ฅธ ํ๋ซํผ์ 0x0์ด๋ฏ๋ก "ํ๊ธฐ"ํ๊ฑฐ๋ ์ด ๋ฌธ์ ์ ๋ํ ํน์ ํ๋๊ทธ๋ฅผ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์จ๋ syscall_windows*๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
ํจ์ ์ด๊ธฐ(
...
๊ณต์ ๋ชจ๋ := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | isDeleteOn )
์ฌ๊ธฐ์ isDeleteOn์ ๋ชจ๋์ ์ ํ๋๊ทธ๊ฐ ํฌํจ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
@๊ฐ์ด๋ธ๋๋
์ฝ๋๋ฅผ ์์ฑํ ๋ ํฌ๋ก์ค ํ๋ซํผ์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๋์ผํ os.OpenFile
ํธ์ถ์ด ์ฌ๋ฌ ํ๋ซํผ์์ ์ปดํ์ผ๋๋ค๊ณ ํด์ ์ฝ๋๊ฐ ํ๋ซํผ ๊ฐ์ด๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค. Windows์๋ FILE_SHARE_DELETE
์ฌ์ฉํ ๋ ๊ณ ๋ คํด์ผ ํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ณด์ ๊ณ ๋ ค ์ฌํญ์ด ์์ผ๋ฉฐ ํ์ผ ์๋ช
์ฃผ๊ธฐ์ ์๋ฏธ ์ฒด๊ณ๋ POSIX์ Windows ์์คํ
๊ฐ์ ๋๋ฌด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ์ผ ์ฒ๋ฆฌ ์ฝ๋๋ ํ๋ซํผ ๊ฐ์ ์ ์ด๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ๋ณด์ด์ง ์์ ๊ฒ์
๋๋ค. FILE_SHARE_DELETE
์ฌ์ฉํ๋ฉด ๋ณธ์ง์ ์ผ๋ก ๋ ์ด์ค ์๋ ํ์ผ ์์คํ
์ํ๋ฅผ ๋ณด์ฅํ ๋ฐฉ๋ฒ ์์ด(๊ทธ๋ฆฌ๊ณ ์ด๊ธฐ๋ฅผ ์ํ POSIX์ unlink
ํ์ผ ์ก์ธ์ค์ ์ด์ ์์ด) POSIX.1-2008 ์ด์ ์ํฉ์ ๋์ด๊ฒ ๋ฉ๋๋ค. ํ์ผ).
์ด์จ๋ , ๋น์ ์์ ๊ฐ์ด์๋ ํ๋๊ทธ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ syscall.FILE_SHARE_DELETE
Windows์์์ 0
๋ค๋ฅธ ํ๋ซํผ์์, ๋น์ ์ ์ฌ์ ํ ์ฝ๊ฒ ๋ค์ ์์ ์ ์ผ์ ๋น๋ ํ๊ทธ์ ์ํด ์ ์ด์ ์ ์์ ํจ๊ป ๊ทธ๊ฒ์ ํ ์ os.OpenFile
๋ฅผ ํธ์ถํ๋ ๊ธฐ๋ณธ ์ฝ๋๋ ๋ชจ๋ ํ๋ซํผ์์ ๋์ผํ ์ ์์ต๋๋ค(ํด๋น ์ฌ์ฉ์ ์ง์ ํ๋๊ทธ ์ฌ์ฉ).
๋ค๋ฅธ ํ๋ซํผ์ syscall
ํจํค์ง์ ์กด์ฌํ๋ ํ๋ซํผ๋ณ ํ๋๊ทธ๊ฐ ๋ง์ด ์์ง๋ง os
ํจํค์ง์ ์ํด ๋ชจ๋ ๋
ธ์ถ๋ ์๋ ์์ผ๋ฉฐ ํ๋ซํผ์์ ์๋ํ์ง ์์ต๋๋ค. ์ง์ํฉ๋๋ค. ํ๋ซํผ๋ณ ์ฝ๋ ๋ฐ ๋์์ ์ํ๋ฉด syscall
ํจํค์ง์ ๋๋ฌํด์ผ ํฉ๋๋ค.
์ด๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ (์ ์ฌ์ ์ผ๋ก) ์ฌ๊ธฐํด์ผํ๋ ์ ์ผํ ๊ฒ์ ์ง์์
๋๋ค syscall.FILE_SHARE_DELETE
์ syscall.Open
(๊ฒฐ๊ณผ์ ์ผ๋ก os.OpenFile
) Windows์์.
์์์ ์ธ๊ธํ๋ฏ์ด FILE_SHARE_DELETE๋ฅผ ์ถ๊ฐํ๋ฉด ๋ง์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค์๋ก Unix ๋์์ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง ์ข์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ์ผ์ด ์กด์ฌํ๋ ๊ฒ์ ๋ณด๊ธฐ ์ํด ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ์์ฉ ํ๋ก๊ทธ๋จ์ด ํ์ผ์ ์ญ์ ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ์์ ํ์ผ์ ์ฐพ์ ์ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ FILE_SHARE_DELETE๋ ๋์ค์ ์ญ์ ํ๋๋ก ํ์๋ง ํฉ๋๋ค. ํ์ผ์ด ๋จ์ ์์ต๋๋ค. UNIX์์๋ ์ ์๋ํ์ง๋ง Windows์์๋ ์๋ํ์ง ์์ต๋๋ค. UNIX ๋์์ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด FILE_SHARE_DELETE๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
@mattn ๋๋ ๋น์ ์ ์ฐ๋ ค์ ๋์ํฉ๋๋ค - ์ฌ๋๋ค์ ๋ฏธ๋ฌํ ์๋ฏธ๋ฅผ ์ดํดํ์ง ์๊ณ Windows ์ฝ๋๋ฅผ POSIX ์์คํ
๊ณผ "๋์ผํ๊ฒ ์๋"์ํค๊ธฐ ์ํด ํธ์์ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํด๋น ํ๋๊ทธ์ ์ก์ธ์คํ๊ธฐ ์ํด syscall
ํจํค์ง๋ก ์ด๋ํด์ผ ํ๋ ๊ฒฝ์ฐ ํด๋น ํ๋๊ทธ๊ฐ ๋ฌด์์ ํ๋์ง ์ดํดํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
@mattn , Unix์ ์ ์ฌํ ๋์์ ๊ฒฝ์ฐ ์ฑ์๋ ํ๋ซํผ ์ค๋ฆฝ ์ฝ๋ 2์ค์ด ์ถ๊ฐ๋ก ํ์ํฉ๋๋ค.
fd, err := os.OpenFile(path, ... | syscall.FILE_SHARE_DELETE, 0600)
...
tmp_path := mkTempName()
err = os.Rename(path, tmp_path) // works immediately; path is now available
err = os.Remove(tmp_path)
์ด๊ฒ์ ๋ฌธ์ํํ๋ ค๋ฉด os.OpenFile()์ ๋ํ ๋ฌธ์์์ ํ ๋ฌธ์ฅ์ด ํ์ํฉ๋๋ค.
๋ด Windows ์ฝ๋์์ ์์ ํ๋ ๋ชจ๋ ์ฌ๋์ด ์ ์ฉํด์ผ ํ๋ ํจ์น๋ฅผ pkg syscall์ ๋ฐฐํฌํ์ง ์๋๋ก ํด์ฃผ์ธ์! https://github.com/golang/go/issues/32088#issuecomment -493876119๋
์ ๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋๋ถ๋ถ์ ์ฌ์ค์ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅด๊ฒ ํํํ๋ฉด ์์ฝํ๊ณ ํ๋ ๋ฐฉ์นจ์ ์ค์ ํ๊ฒ ์ต๋๋ค.
์์ ํญ๋ชฉ:
file, err := os.OpenFile(..., os.O_RDWR | syscall.FILE_SHARE_DELETE, ...)
mycode_windows.go
const OPENFILEFLAG = syscall.FILE_SHARE_DELETE
mycode_others.go
const OPENFILEFLAG = 0
๋ค์์ ์ฌ์ฉํ์ญ์์ค.
file, err := os.OpenFile(..., os.O_RDWR | OPENFILEFLAG, ...)
์ด์ ๋์ํ๋ฉด ์์ ์์ ์ด ์ต์ํ๋๋ฉฐ(ํ๋์ ๋ผ์ด๋) ์ํ์ด ๋งค์ฐ ๋ฎ์ต๋๋ค.
ํฌํ๋ฅผ ํ๋ฉด ๋น ๋ฅด๊ฒ ์์ ํ ์ ์์ต๋๋ค.
๋์: FILE_SHARE_DELETE๋ฅผ ํ๋๊ทธ๋ก ํ์ฉํ๋ ์์ฒญ์ด ์ ์ฉํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ชฉ์ ์ด ๋ฌด์์ธ์ง ์ดํดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์์ง ์ด์ ๋์ํ์ง ์์ต๋๊น?
@mattn pls๋ https://github.com/golang/go/issues/32088#issuecomment -494305074๋ฅผ ์ฐธ์กฐ
๋ชฉ์ : ๊ฐ๋ฐ์๊ฐ ์ด๋ฆฐ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ์ญ์ ํ ์ ์์ต๋๋ค.
๋๋ฝ๋ ์ฌํญ: syscall_windows.go๋ ํ์ฌ ํ๋ ์ฝ๋ฉ๋์ด ์์ต๋๋ค .
func Open(path string, mode int, perm uint32) (fd Handle, err error) {
...
sharemode := uint32(**FILE_SHARE_READ | FILE_SHARE_WRITE**)
์ ์๋ ๋ณ๊ฒฝ ์ฌํญ:
๊ฐ๋ฐ์๊ฐ ๋นํธ 4(FILE_SHARE_DELETE)๊ฐ ์ผ์ง ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ฉด ๊ณต์ ๋ชจ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | **(mode & FILE_SHARE_DELETE)** )
Rename() ๋๋ Remove() ์ ์ Close()๋ฅผ ํธ์ถํ์ง ์๋ ์ด์ ๊ฐ ์ฌ์ ํ ๊ถ๊ธํฉ๋๋ค. Go์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. ํ์ผ์ Rename() ๋๋ Remove() ์ ์ Close()๋ก ๋ซํ๋๋ค. Renamoe/Rename ๋ค์์ Close()๋ฅผ ํธ์ถํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@networkimprov ๊ฐ ๊ณ ๋ คํ๊ณ ์๋ ๋น์ฆ๋์ค ์ฌ๋ก๊ฐ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์ ๊ณต์ ํ์ผ์ด ๋ ๊ฒ์ ๋๋ค. ๋ด ์ฑ๊ณผ ๋ค๋ฅธ ์ฑ์ด ์ด ํ์ผ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. (๋ด ์ฑ์ด ์ถฉ๋ํ๋๋ผ๋) ์ด ํ์ผ์ ํ์ธํ๊ณ ์ถ์ต๋๋ค. ์์ ์ ๋ง์น ํ์๋ ๋ ์ด์ ์กด์ฌํ์ง ์์ ๊ฒ์ด๋ฏ๋ก ์์ฑํ๊ณ Remove()ํ๊ณ ์ฑ์ ๋ซ๊ฑฐ๋ ์ฑ์ ๋ซ์ผ๋ฉด ํ์ผ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
ํ์ง๋ง @networkimprov ๊ฐ Rename()์ ์ฌ์ฉํ๋ ค๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์๋ง๋ diff ์ฌ์ฉ ์ฌ๋ก์ผ ๊ฒ์ ๋๋ค.
https://github.com/golang/go/issues/32088#issuecomment -494305074์์ ์ธ๊ธํ๋ฏ์ด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊น์ง ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ ํ์ผ์ ๋ซ์ ํ์๊ฐ ์์ต๋๋ค.
@mattn , pls๋ C ๋ฐ C++ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ ์ ์๋ OS ๊ธฐ๋ฅ์ ์ฌ์ฉํด์๋ ์ ๋๋ค๊ณ ์ฃผ์ฅํ์ง ์์ต๋๋ค.
๋ด ์ฑ์ด ์ถฉ๋ํ๋๋ผ๋ ์ด ํ์ผ์ด ์๋ฃ๋๋ฉด ๋ ์ด์ ์กด์ฌํ์ง ์๊ฒ ํ๊ณ ์ถ์ต๋๋ค.
@guybrand defer
๋ฌธ์ ๋ชจ๋ ์ ํ์ ์ถฉ๋์์ ์คํ๋๋ ๊ฒ์ด ๋ณด์ฅ๋์ง ์์ผ๋ฏ๋ก ํ์ผ ์ญ์ ๋ฅผ ํ์ธ ํ๋ ค๋ ๊ฒฝ์ฐ os.Remove
์์
์ ์ฐ๊ธฐํ๋ ๊ฒ์ ์ ๋ขฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ๋ํด ๊ฐ์ญ์์ค. ์๋์ผ๋ก ์ญ์ ๋๋ ํ์ผ์ ์ํ๋ค๋ฉด ์์คํ
์ด ์ญ์ ํ๋ ์์ ํ์ผ์ด ๋ ๋์ ์ ํ์
๋๋ค. ๋ ํ๋ก๊ทธ๋จ์์ ๊ณต์ ํ๋ ํ์ผ ์์น๋ฅผ ์ํ๋ฉด ํ์ผ ์กด์ฌ๊ฐ ์๋ ์ ๊ธ(์: POSIX์ ๊ฒฝ์ฐ fcntl
์ ๊ธ ๋ฐ Windows์ ๊ฒฝ์ฐ LockFileEx
/ UnlockFileEx
)์ผ๋ก ์กฐ์ ํด์ผ ํฉ๋๋ค. .
#32088(์ฃผ์)์์ ์ธ๊ธํ๋ฏ์ด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊น์ง ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ ํ์ผ์ ๋ซ์ ํ์๊ฐ ์์ต๋๋ค.
@mattn , pls๋ C ๋ฐ C++ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ ์ ์๋ OS ๊ธฐ๋ฅ์ ์ฌ์ฉํด์๋ ์ ๋๋ค๊ณ ์ฃผ์ฅํ์ง ์์ต๋๋ค.
@networkimprov ์ด๋ฆฐ ํ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ์์
์ ์ ํจํ ์ฌ์ฉ ์ฌ๋ก์ด์ง๋ง HANDLE
ํ์ผ์ ๋ณด์ ํ๊ณ ์๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด ์ด๋ฏธ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๊น? FILE_SHARE_DELETE
์ ์ ์ผํ ๋ชฉ์ ์ ํ์ผ์ด ์ด๋ ค ์๋ ๋์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋, ๋น์ ์ด ์ฌ์ฉํ ์์๋ FILE_SHARE_DELETE
์ง๊ธ, ๋น์ ์ ๋จ์ง ์๋์ผ๋ก ํธ์ถ ํ ํ์๊ฐ CreateFileW
์ ๋ ๋๋ ๊ฒฐ๊ณผ๋ฅผ ํต๊ณผ os.NewFile
. ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ์๋ฅผ ์ฌ๊ธฐ์์ ์ฐพ์ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ HANDLE
๋ os.NewFile
๋ก ์ ๋ฌ๋ ์ ์์ต๋๋ค.
@mattn ๋๋ ์ด ๊น๋ฐ์ด ์ ์ฉํ ๋๊ตฌ๋ผ๊ธฐ๋ณด๋ค ๋ฐ์ด์ ๊ฐ๊น๋ค๋ ๋ฐ ๋์ํ๊ธฐ ์์ํ์ต๋๋ค. ๋ช
ํํ ํ์๋ฉด, ์ ๋ ์ค์ ๋ก ์ด ํ๋๊ทธ๋ฅผ ์ํ์ง ์์ผ๋ฉฐ, ๊ทธ ์กด์ฌ์ ๋ํด ์ ๊ฐ ๋ณผ ์ ์๋ ์ ์ผํ ์ฃผ์ฅ์ POSIX์ Windows ๊ฐ์ ์ ์ด์ ์์ ์ฑ๊ณผ ํจ๋ฆฌํฐ์
๋๋ค. ๋ฐ๋ฉด์ ์์์ ์ธ๊ธํ๋ฏ์ด CreateFileW
(์ด ํ๋๊ทธ๋ฅผ ์ง์ ํ์ฌ)๋ฅผ ์๋์ผ๋ก ํธ์ถํ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ os.NewFile
๋๊ธฐ๋ ๊ฒ๋ ๋น๊ต์ ์ฝ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํ ์ง์์ ์ถ๊ฐํ์ญ์์ค.
@havoc-io os.File.Rename()์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ข์ ํด๊ฒฐ์ฑ ์ด ๋ ๊ฒ์ด์ง๋ง ์๋์ ์ผ๋ก ๋ฌด๊ฑฐ์ด ๋ฆฌํํธ์ ๋๋ค.
๋ค์ CreateFileW + os.NewFile(), https://github.com/golang/go/issues/32088#issuecomment -493876119๋ฅผ ์ฐธ์กฐ
@havoc-io
๋ด ์ฑ์ด ์ถฉ๋ํ๋๋ผ๋ ์ด ํ์ผ์ด ์๋ฃ๋๋ฉด ๋ ์ด์ ์กด์ฌํ์ง ์๊ฒ ํ๊ณ ์ถ์ต๋๋ค.
@guybrand ๋ชจ๋ ์ ํ์ ์ถฉ๋์์ defer ๋ฌธ ์คํ์ด ๋ณด์ฅ๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋ด๊ฐ "๋ด ์ฑ์ด ์ถฉ๋ํ๋๋ผ๋"๋ผ๊ณ ๋งํ ๊ฒ๊ณผ ์ ํํ ์ผ์นํ์ต๋๋ค.
๊ทธ ์กด์ฌ์ ๋ํด ๋ด๊ฐ ๋ณผ ์ ์๋ ์ ์ผํ ์ธ์๋ POSIX์ Windows ๊ฐ์ ์ ์ด์ ์์ ์ฑ๊ณผ ํจ๋ฆฌํฐ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด "POSIX์ Windows ๊ฐ์ ์ ์ด์ ์์ ์ฑ๊ณผ ํจ๋ฆฌํฐ"๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์ด๋ผ๋ ์ ์ ๋์ํ์ง ์์ต๋๋ค. IMO๋ ๊ฐ๋ฐ์๊ฐ ํ๋์ด ๋์ผํ์ง ์์ ๋ ๋์ผํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ ํผ๋์ค๋ฝ๊ฒ ํ ๋ฟ์ ๋๋ค. ์์์ ๋ช ๊ฐ์ง ์๋ฅผ ์ ์ํ์ต๋๋ค.
CreateFileW๋ฅผ ์๋์ผ๋ก ํธ์ถํ๊ธฐ ์ฝ์ต๋๋ค.
๊ทธ๊ฒ์ ์ ๋ง ์ฌ์ด ์ผ์ด๋ ์๋๋ , ๋ค์ ๋งํด์ "์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ง์ํ๊ณ ์ถ์ง ์์ต๋๋ค"๋ผ๊ณ ๋งํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฑด ๊ทธ๋ ๊ณ IMO๋ ๋ด๊ฐ ์๋๋ผ
์ฐธ๊ณ ๋ก, FILE_SHARE_DELETE ์ฌ์ฉ์ ํฌ๊ธฐํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์จ์: https://codereview.appspot.com/8203043/
erlang/otp์์ ์ปค๋ฐ: https://github.com/erlang/otp/commit/0e02f488971b32ff9ab88a3f0cb144fe5db161b2
ํ์ด์ฌ: https://bugs.python.org/issue15244
@havoc-io os.File.Rename()์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ข์ ํด๊ฒฐ์ฑ ์ด ๋ ๊ฒ์ด์ง๋ง ์๋์ ์ผ๋ก ๋ฌด๊ฑฐ์ด ๋ฆฌํํธ์ ๋๋ค.
Re CreateFileW + os.NewFile(), #32088(์ฃผ์)์ ์ฐธ์กฐํ์ธ์.
@networkimprov ๊ทธ๋ฅ os.Rename(file.Name(), <target>)
์ฐ๋ฉด ์๋๋์ ? ๊ธฐ๋ณธ์ ์ผ๋ก FILE_SHARE_DELETE
์ผ์ ธ ์์ง ์์ Go์ ์ฅ์ ์
๋๋ค. HANDLE
ํ์ผ์ ๋ณด์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ file.Name()
๊ฐ ์ฌ์ ํ ์ ํจํ ๊ฒ์ ๊ฐ๋ฆฌํฌ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. renameat
๊ฒฝ์ฐ์๋ POSIX์์ ๋ณด์ฅํฉ๋๋ค. CreateFileW
+ os.NewFile
์ ๊ด๋ จํ์ฌ ๊ทํ์ ์๊ฒฌ์ ์ค๋ช
๋ ๋๋ถ๋ถ์ ์คํ์ ๊ด๋ จ ์ด ์์ผ๋ฉฐ makeInheritSa
๋ ๊ฑฐ์ ํ์คํ ๊ทํ ๊ฐ ์ํ์ง fixLongPath
๊ฒฝ๋ก ๊ธฐ๋ฅ์ผ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์๋ง๋ ๋น์ ์ด ์ค๋ช
ํ ์ฌ์ฉ ์ฌ๋ก์ ํ์ํ์ง ์์ ๊ฒ์
๋๋ค.
@guybrand ๋ด ๋ง์ ์๋ฏธ๋ฅผ ๋ช ํํํ๊ธฐ ์ํด ...
์์ ์ฑ: API ํ๋ฉด ์์ ์ฑ(์ FILE_SHARE_DELETE
๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ)
์ ์ด ํจ๋ฆฌํฐ: os.OpenFile
์ flag
๋งค๊ฐ๋ณ์๋ฅผ ํตํด os.OpenFile
CreateFileW
ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ ๊ธฐ๋ฅ. ์๋ฅผ ๋ค์ด, POSIX์์ syscall.O_NOFOLLOW
ํตํด os.OpenFile
๋ฅผ ๋ผ์ฐํ
ํ ์ ์์ง๋ง Windows์์๋ syscall.FILE_FLAG_OPEN_REPARSE_POINT
ํตํด os.OpenFile
๋ฅผ ๋ผ์ฐํ
ํ ์ ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง, os
ํจํค์ง๊ฐ POSIX API๋ฅผ ์ค์ฌ์ผ๋ก ๋ชจ๋ธ๋ง๋์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ ์ ์ด์ ์ ์ฒด ํจ๋ฆฌํฐ๋ ํ๋ ๊ฟ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ํ ๋ syscall.CreateFileW
์ ๋๋ฌํ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค.
@mattn ๋งํฌ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. Go CL์ syscall.Open() _default_๋ฅผ ํจ์นํ๋ ๊ฒ์ด์์ต๋๋ค. ํ ๋ก ์์๋ Open()์ ๋ํด _flag_๋ฅผ ํ์ฉํ์ง ์๋ ์ผ๋ฐ์ ์ธ ์ด์ ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. ํ์ฌ ํจํค์ง๋ ํ๋๊ทธ๊ฐ ์๋ os.File์ ๋ฐํํ ์ ์์ง๋ง ํธ์ถ์๊ฐ ํด๋น ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ์ญ์ ํ๋ ค๊ณ ์๋ํ๋ ๊ฒฝ์ฐ์๋ง ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ๋๋ฌธ ๊ฒฝ์ฐ์ ๋๋ค.
Python ์ค๋ ๋๋ ์์์ ์ด ๊ฒ์ฒ๋ผ ์ญ์ ํ๊ธฐ ์ ์ ์ด๋ ค ์๋ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผ ํ๋ค๊ณ ์ธ๊ธํฉ๋๋ค.
Erlang์ 6๋ ๋๊ฒ file_share_delete๋ฅผ _default_๋ก ์ฌ์ฉ
์์ ๋งํฌ๋ Erlang ๊ฒฝํ๊ณผ Python ์ค๋ ๋๋ฅผ ๋ฐ์ํ๋ฉด ๋ค์์ด ๋ถ๋ช ํฉ๋๋ค.
๋ฐ๋ผ์ syscall.Open()์ ๊ธฐ๋ณธ์ ์ผ๋ก file_share_delete ๋นํ์ฑํ ํ๋
1.14 ์ฃผ๊ธฐ ๋์ ํด๋น ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ๊ฐ ๋ํ๋๋ฉด ๋ช ์์ ํ๋๊ทธ ๋ฐฉ๋ฒ์ ๋์ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ syscall.Open()์ ๊ธฐ๋ณธ์ ์ผ๋ก file_share_delete๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ syscall์ ํ์ํ ๊ฒฝ์ฐ(์: ๋๋ฒ๊น ) ๋นํ์ฑํํ๋ ์ ์ญ ํ๋๊ทธ๋ฅผ ์ ๊ณตํด์ผ ํ๋ค๊ณ ๊ฒฐ๋ก ์ง์์ต๋๋ค.
@networkimprov ๋ฏธ๋ฌํ๊ณ ๋ฏธ๋ฌํ์ง ์์ ๋ฐฉ์์ผ๋ก ์๋ง์ ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ๊นจ๋ ๊ฒ ์ธ์๋ ๋ฌธ์ ์ ์ฌ์ค์ ์ง๊ธ ์ด ํ๋๊ทธ ๋ฅผ FILE_SHARE_DELETE
์ ๋ถ์ฌ์ ์์กดํ๋ ํ๋ก๊ทธ๋จ ์ ๋ณด์ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์
๋๋ค. . ํนํ, ์ด๋ ค ์๋ ํ์ผ ๋ฐ ๋๋ ํ ๋ฆฌ์ ๋ถ๋ณ์ฑ์ ์์กดํ๋ ํ๋ก๊ทธ๋จ์ ๋ํ ์ฌ์ฉ ์๊ฐ ํ์ธ ์ทจ์ฝ์ ์ด ๋ง์ด ๋ฐ์ํฉ๋๋ค.
ํธ์ง: ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ ๋์ ์๊ฐ์ด๊ณ ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ๊ฑฐ์ ๊นจ๋จ๋ฆด ๊ฒ์ธ์ง์ ๋ํ ์์ธํ ๋ด์ฉ์
Go on Windows์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ Linux ๋๋ ๊ธฐํ Unix์
์ฝ๋๊ฐ GOOS=windows ๋์์ ์์กดํ๋ ๊ฒฝ์ฐ Linux์์ ์์๋์ด ์ทจ์ฝํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ ๋ณด์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค.
os.Rename() ๋ฐ .Remove()๋ Windows์์ ์ฐจ์ด์ ์ ๋ฌธ์ํํ์ง ์์ผ๋ฏ๋ก ์๋ฌด๋ ๊ทธ๋ค์ด ์กด์ฌํ๋ค๊ณ ์ถ์ธกํ์ง ์์ต๋๋ค. ์ง๊ธ ๋ฌธ์ํํ๋ฉด ๊ธฐ์กด ์ฝ๋๊ฐ ์์ ๋์ง ์์ต๋๋ค. ๋นํธํ์ฑ์ ์์ ํ๊ณ ์ด์ ๋ํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๊ฒ์ํ๋ฉด ํจ์ฌ ๋ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
Erlang์ file_share_delete๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฑํํ๊ธฐ ์ ์ ์ ์ ์ฌ์ฉ๋์์ต๋๋ค.
Go on Windows์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ Linux ๋๋ ๊ธฐํ Unix์
์ฝ๋๊ฐ GOOS=windows ๋์์ ์์กดํ๋ ๊ฒฝ์ฐ Linux์์ ์์๋์ด ์ทจ์ฝํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ ๋ณด์ ๋ฌธ์ ๊ฐ ์์ ์ ์์ต๋๋ค.
@networkimprov
์ด ๋ ผ๋ฆฌ์ ๋ฐ๋ผ Windows์ ํ์ผ ์ด๊ธฐ ์ธํ๋ผ๋ POSIX์ ๊ธฐ๋ณธ ๋์๊ณผ ์ผ์นํ๋๋ก ํ๋ก์ธ์ค ์์ฑ ์ ๋ฐ์ ๊ฑธ์ณ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ผ ์ค๋ช ์๋ฅผ ์์ ๊ฐ๋ฅํ๋๋ก ์์ ํด์ผ ํฉ๋๋ค. ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ๋ฐํ์/ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด์ ๊ธฐ๋ณธ ๋์์ ์์กดํ๋ ๊ฒ์ผ๋ก ๋น๋๋ฐ์ ์ ์์ผ๋ฉฐ ํ ํ๋ฆฟ CVE๋ ์ฌ์ฉ์๊ฐ ํ๋ก๊ทธ๋จ์ ์ํด ํ์ผ๋งํ ์ ์๋๋ก ๋ฆด๋ฆฌ์ค ์ ๋ณด์ ํฌํจ๋ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฌผ๋ก ๊ทธ๊ฒ์ด ์๋ฃ๋ ๊ฒ์ ์๋๋ฉฐ ๋์ Go์ ๋ฐํ์ ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค๋ก ๊ตฌ๋ถ๋ฌ์ ธ POSIX์ ๊ธฐ๋ณธ ๋ฐ ์๋ชป ์ค๊ณ๋ ๋์์ ํด๊ฒฐํ๊ณ Windows๊ฐ ์ํํ๋ ์์ ์ ๋ฏธ๋ฌ๋งํ๋ ค๊ณ ํฉ๋๋ค.
์ํฉ์ ๊ณต์ ํ์ผ ์ก์ธ์ค์ ๋์ผํฉ๋๋ค. Windows๋ ํ๋ฆผ์์ด ๋์์ธ์ด ์ณ์๊ณ POSIX.1-2008์ ๋์์ธ ํ๊ณ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ง์ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํ์ต๋๋ค.
@mattn์ ํฌํจํ์ฌ ์์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธ ํ ๊ฒ์ฒ๋ผ ๋ํ, FILE_SHARE_DELETE
POSIX์ ๊ฐ์ ์๋์ฐ ๋์ํฉ๋๋ค์ํ์ง ์์ต๋๋ค ๊ฐ๋ฐฉ ํ์ผ - ์ฌ์ ํ ๋ค๋ฅธ ๊ฒ๋ณด๋ค์ด ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํจ์ฌ ๋ ๋ช
๋ฐฑํด์ง ๊ฒ์ด๋ค ์ค์ํ ํ๋ ์ฐจ์ด๊ฐ์์ ๊ฒ์
๋๋ค os.Remove
๋ฐ os.Rename
๋์.
๊ทํ์ ์ฝ๋๊ฐ ๋ชจ๋ ํ๋ซํผ์ ๋์์ ๋ณดํธ์ ์ผ๋ก ์์กดํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋ซํผ(Windows์์ POSIX ๋์์ ์์กดํ๋ ๊ฒ๋ ํฌํจ)์์ ์์๋๊ณ ์ทจ์ฝํ ์ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ฝ๋์ ํ๋ซํผ ๋ณํ์ ์ดํดํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ์๊ฐ์ ๋ค์ด์ง ์๋๋ค๋ฉด ํ๋ซํผ ๊ฐ ๊ฐ๋ฐ์ ํ๊ณ ์์ง ์์ ๊ฒ์ ๋๋ค.
์ด์จ๋ @ianlancetaylor๋ ์ด๋ฏธ ์ ์ญ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๊ธฐ๋ฅ์ ์ผ๋ ๊ฒ์ ์ ์ดํ๋ โโ์์ด๋์ด์
์ ์๊ฐ์๋ ์ฌ๊ธฐ์ ์ ์ผํ๊ฒ ๊นจ์ง์ง ์๋(๊ทธ๋ฆฌ๊ณ ๋ณด์์ ์์ํ์ง ์๋) ์ต์
์ syscall.Open
์ flag
์ธ์์ syscall.FILE_SHARE_DELETE
์ ๋ํ ์ง์์ ์ถ๊ฐํ๊ฑฐ๋ ๊ทธ๋ฅ ๊ฐ์ ๋ก FILE_SHARE_DELETE
๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ ์ฌ์ฉ์๋ CreateFileW
+ os.NewFile
. ์, ์ด ๋์์ ์ํ๋ ๊ฐ๋ฐ์์ ์ฝ๊ฐ์ ์์
์ด ํ์ํ์ง๋ง Win32์ POSIX๋ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ์ง์น์ด๋ฉฐ ๋ฐํ์๊ณผ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฐจ์ด์ ์ ํฌ์ฅํ๋ ๊ฒ๋งํผ ์ข์ ์ผ์ ํ๋ค๋ ๊ฒ์ด ๋๋์ต๋๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ๋๋ ์ด๋ฌํ ํ๋ซํผ ์ฌ์ด์๋ ํจ์ฌ ๋ ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์์ ํ ๋ค๋ฅธ ๊ถํ ๋ชจ๋ธ, os.File.Chmod
๊ฐ Windows์์ ์๋ํ์ง ์๋๋ค๋ ์ฌ์ค, os.Chown
๊ฐ Windows์์ ์๋ํ์ง ์๋๋ค๋ ์ฌ์ค Windows, ๋ด๋ถ ํด๋ฌ๊ฐ ์๋ก ๋ค๋ฅธ ํ๋ซํผ์์ ์๋ก ๋ค๋ฅธ ์ ํ์ ํ์ผ์ ์ง์ํ๋ค๋ ์ฌ์ค ๋ฑ. Go์ ๋ฐํ์ ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ต์ ์ ๋คํ์ง๋ง(์ ์ํํ์ง๋ง) ํ๋ซํผ ๊ฐ ๊ฐ๋ฐ ๋ฌธ์ ์ ๋ํ ๋ง๋ณ ํต์น์ฝ์ ์๋๋๋ค. ์ด๋ ์์ ์์ ๊ฐ๋ฐ์๋ ์ด๋ฌํ ์ฐจ์ด์ ์ ์ค์ค๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์์ ํ๊ธฐ ์ํด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ๊ฐํ๋ ๊ฒ( ์ฌ๋ฐ๋ฅธ ๋ง์ ํ์ง ์์์์ ์ฃผ๋ชฉํ์ธ์) ๋ชจํธํ ํ๋์ ์ฃ์ง ์ผ์ด์ค๋ ๋์๊ฒ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ด์ ๋ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ๋ ๋ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค.
ํ์ฌ Docker ์์ง์ด ํ์ฑ ๋ก๊ทธ์ ์ด๋ฆ์ .1์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฐ๊พธ๋ ๋ฐฉ์์ผ๋ก Docker ๋ก๊ทธ ํ์ ๋
ผ๋ฆฌ๊ฐ ์๋ํ๋ฉด ์ด์ ์ด๋ฆ์ผ๋ก ์ ๋ก๊ทธ๋ฅผ ๋ง๋ญ๋๋ค.
docker logs --follow <container>
๋ช
๋ น์ผ๋ก ๋ก๊ทธ๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ถ์ ํ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ
ํ์ผ ์์คํ
์ด๋ฒคํธ์์ ๋ค์์ ์ ์ ์์ต๋๋ค.
https://github.com/moby/moby/blob/916eabd459fe707b5c4a86377d12e2ad1871b353/daemon/logger/loggerutils/logfile.go#L552 -L593
Windows๊ฐ ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์ฆ์ ์์์ฐจ๋ฆฌ๋๋ก ํ๋ ๋
ผ๋ฆฌ๋ ์์ต๋๋ค.
https://github.com/moby/moby/blob/916eabd459fe707b5c4a86377d12e2ad1871b353/daemon/logger/loggerutils/logfile.go#L670 -L676
์ด ๋ชจ๋ ๊ฒ์ด Linux์์๋ ์ ์๋ํ์ง๋ง Windows์์๋ ๋ก๊ทธ ๋ค์์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ ๊ฒฝ์ฐ The process cannot access the file because it is being used by another process.
์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค(๋ฌธ์ : https://github.com/moby/moby/issues/39274 ).
๋ก๊ทธ๋ฅผ ๋ฐ๋ฅด๋ ํด๋ผ์ด์ธํธ๊ฐ n๊ฐ ์์ ์ ์์ผ๋ฏ๋ก ๋จผ์ ์ด๋ ค ์๋ ๋ชจ๋ ํ์ผ ํธ๋ค์ ์์งํ๊ณ ํ์ผ ํ์ ์ ์ ๋ซ๋ ๊ฒ์ด ๋งค์ฐ ๊น๋ค๋ก์ธ ์ ์์ผ๋ฏ๋ก syscall.FILE_SHARE_DELETE
๋ํ ์ง์์ ์ ๋ง ๋ณด๊ณ ์ถ์ต๋๋ค.
์๋ ! ๋น ๋ฅธ ๋ฐฐ๊ฒฝ: ์ ๋ Chrome CI ์ธํ๋ผ์์ ์ผํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์์ค ์์ ์ ์ฝ๋๋ฅผ Go๋ก ์ด์ํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ Windows์์ ๋งค์ผ ์์ญ๋ง ๊ฐ์ ํ ์คํธ ํธ์ถ์ ์คํํฉ๋๋ค.
๋๋ ๋ชจ๋ ์๊ฒฌ์ ์ฝ์์ผ๋ฉฐ ๋ค์์ด ๊ฐ ๊ฐ์ธ์ ์๊ฒฌ์ ๋ํ ๋ช ํํ๊ณ ์ ํํ ์์ฝ์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฐ๋ฆฌ์ ์ฌ์ฉ ์ฌ๋ก๋ @networkimprov ์ ๋๋ผ์ด ํน์ฑ๊ณผ ๋ฌ๋ฆฌ Windows์์ ์คํ๋๋๋ก Windows์์ Go ์คํ ํ์ผ์ ๋น๋ํ๋ ๊ฒ์ ๋๋ค. ์ด ์ฃผ์์์ ์ด "Windows์์ POSIX ๋์ ๊ฐ์ " ์ฌ์ฉ ์ฌ๋ก๋ ๋ฌด์ํ๊ฒ ์ต๋๋ค. ์ด๋ ์๋ชป๋ ๊ฐ์ ์ด๊ณ @mattn ์ ๋์ด
๋ง์ด๊ทธ๋ ์ด์ ์ ์ผ๋ถ๋ก #39274์ ์ ์ฌํ ๋ก๊ทธ ํ์ผ ํ์ ์ผ๋ก ์ธํด ๋ถ๋ถ์ ์ผ๋ก FILE_SHARE_DELETE๊ฐ ํ์ํฉ๋๋ค. ๋ฌธ์ #25965์ ๋ฌธ์ ์ด๊ธฐ๋ ํฉ๋๋ค.
https://codereview.appspot.com/8203043/ ์์ ์ ์ํ ๊ฒ์ฒ๋ผ ์ ์ฒด ๋๊ตฌ ์ฒด์ธ ๋์์ ๋ณ๊ฒฝํ๋ @ianlancetaylor ๋ ์ข์ ์๊ฐ์ด ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ํ์ผ ํธ๋ค์ ์ ๊ธ ํ์ผ๋ก ์ฌ์ฉํ ๋ ์ด ์ ์์ ์ผ๋์ ๋๋ ์ฆ๊ฐ์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋์์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ @havoc-io๊ฐ ๋งํ ๊ฒ. ๊ทธ๋ฌ๋ ์ด๊ฒ๋ ๋ฌด์ํฉ์๋ค.
๋ค์ ๋งํด์ ์ด ์๊ฒฌ์ ๋๋จธ์ง ๋ถ๋ถ์์ ์ด๋ฌํ ์ ์์ ๋ฌด์ํ๊ฒ ์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ถ๋ช ํ Windows ๊ณ ์ ์ ์ด๋ฆ์ ๊ฐ์ง ํธ์ถ๋ณ ํ๋๊ทธ๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก @guybrand๊ฐ ์ ์ํ ๊ฒ์ ๋๋ค.
@mattn ์ด์ ์ ๊ธฐ๊ฐ ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. @guybrand๊ฐ ์ ์ํ๋ ๊ฒ์ ํฉ๋ฆฌ์ ์ ๋๋ค. ์ Windows๋ ํ์ผ ๊ณต์ ์ ๊ด๋ จํ์ฌ ๋ค๋ฅด๊ฒ ์๋ํฉ๋๋ค. ํ์ผ ์ญ์ ๊ถํ๊ณผ ๋น์ทํ์ง๋ง Windows์์๋ ๋งค์ฐ ๋ค๋ฆ ๋๋ค . ์ด๋ฏธ ์ฌ๋ฌ ๊ฐ์ง๋ก ๊ฐ๋ผ์ง๊ณ ์์ต๋๋ค. "๊ฐ๋ฐ์๊ฐ ๊ทธ ๋์์ ์คํดํ ์ ์๋ค"๋ ์ ์ฅ์์ Windows ์ ์ฉ ํ๋๊ทธ์ ๋ํด ์ด์๋ฅผ ์ ๊ธฐํ๋ ๊ฒ์ ์ฌ์ค์ด ์๋๋ผ ์๊ฒฌ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์์ ์ด ํ๋ ์ผ์ ๋ชจ๋ฅด๊ฑฐ๋ MSDN์ ์ค๋ช ์๋ฅผ ์ฝ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ๐์ ๋ํ ์ ๋นํ ์ด์์ ๋๋ค๋ง, ์ ๋ฒํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ํ์ ํ๋๊ทธ๋ก ์ฐจ๋จํ๋ค๋ ์ด์ ๋ก ๊ฐ๋ ฅํ ์ด์๋ ์๋๋๋ค.
์์ด๋ฌ๋ํ๊ฒ๋ ์ด๊ฒ์ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๋๊น์ง #25965๋ฅผ ์์ ํ๊ธฐ ์ํด CreateFileW
์ง์ ํธ์ถํ๋๋ก 'go run'์ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์๋ํ๋ฉด FILE_FLAG_DELETE_ON_CLOSE
๋ ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ฐ์ฌ ํด์!
์ ์์ฑ์ด ์๋ ํ์ผ์ ์ด๊ฑฐ๋ ๋ง๋ค๊ธฐ ์ํด ์ ๊ธฐ๋ฅ(golang.org/x/sys?)์ ๊ตฌํํด์ผ ํ๋์ง ์๋๋ฉด ์๋ ๋์์ ๋ณ๊ฒฝํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ์๊ธฐ ์ํด ์ผ์ด์ค๊ฐ ์ด๋ป๊ฒ ์กด์ฌํ๋์ง ์๊ณ ์ถ์ต๋๋ค. ํ์ฌ ์์ ์๊ฒฌ์์ ์ ์ ์๋ ํ:
1์ ๊ฒฝ์ฐ ์์ฑ์ด ์๋ ํ์ผ์ ์์ฑ/์ด๊ธฐ ์ํด ์ ํจ์์์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ logger.SetOutput(file)์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ค์ ํ ์ ์์ต๋๋ค.
2์ ๊ฒฝ์ฐ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ์์ฑ/์ด ์๋ ์์ต๋๋ค.
BTW, ๋๋ # 25965๊ฐ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ Windows์ ํ๊ณ์ผ ๊ฒ์ ๋๋ค.
(์ด์จ๋ ์ด ์์ฑ์ผ๋ก ์ด๋ฆฐ ํ์ผ์ด ์กด์ฌํ๋ ๋๋ ํ ๋ฆฌ๋ ์ญ์ ํ ์ ์๋ค)
@mattn ๋ค์ ์ฌ์ด์ ๊ท ํ์ ์ค๋ช ํ ์ ์์ต๋๊น?
์ ์ฐ๋ฆฌ๊ฐ ๋ ๋ฒ์งธ ๋์ ์ฒซ ๋ฒ์งธ๋ฅผ ์ ํธํด์ผ ํ๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
[1] ์ฌ๊ธฐ์์ os.OpenFile()์ ๋์์ ๋ณ๊ฒฝํ๋ค๊ณ ๊ฐ์ ํ์ง๋ง ๋ฌธ์ ๊ฐ Open()์ ํธ์ถํ๋ค๋ ๊ฒ์ ๋ฐฉ๊ธ ๊นจ๋ฌ์์ต๋๋ค.
์ฐ์ syscall ํจํค์ง๋ ์ด๋ฏธ ์ ๊ฒจ ์์ต๋๋ค. ๊ทธ๋์ syscall ํจํค์ง๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค.
BTW, ๋๋ # 25965๊ฐ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ Windows์ ํ๊ณ์ผ ๊ฒ์ ๋๋ค.
(์ด์จ๋ ์ด ์์ฑ์ผ๋ก ์ด๋ฆฐ ํ์ผ์ด ์กด์ฌํ๋ ๋๋ ํ ๋ฆฌ๋ ์ญ์ ํ ์ ์๋ค)
@mattn ๊ทธ๊ฒ์ ์์ ํ ์ฌ์ค์ด ์๋๋๋ค. FILE_SHARE_DELETE
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ํ์ผ์ ๋ค๋ฅธ ํด๋๋ก ์ด๋ํ์ฌ ์๋ณธ ํ์ผ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋ค์์ ์ด์ ๋ํ ๊ฐ๋จํ PowerShell ์์
๋๋ค.
# Create folder and open new file with FILE_SHARE_DELETE flag
New-Item -Type Directory -Path C:\folder1
$file = [System.IO.File]::Open("C:\folder1\test.txt", "Create", "ReadWrite", "Delete")
# Create temp folder and move all open files to there
New-Item -Type Directory -Path C:\folder1-removing
Get-ChildItem -Path C:\folder1 -Recurse | Move-Item -Destination C:\folder1-removing\
# Remove original folder
Remove-Item -Path C:\folder1
# Trigger removal for files on temp folder (NOTE! Those will exist on disk until they are closed).
Get-ChildItem -Path C:\folder1-removing -File -Recurse | Remove-Item -Force
# Close file and remove temp folder
$file.Close()
Remove-Item -Path C:\folder1-removing
์ฐ์ syscall ํจํค์ง๋ ์ด๋ฏธ ์ ๊ฒจ ์์ต๋๋ค. ๊ทธ๋์ syscall ํจํค์ง๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค.
@mattn API๊ฐ ๊ณ ์ ๋๋ ๋ฌธ์ ์ผ ๋ฟ์ด๋ผ๋ฉด ์์์ ์ธ๊ธํ / ๋ฐ๋ชจ ์์ syscall.Open
syscall.FILE_SHARE_DELETE
๋ฅผ ์ดํดํ๋๋ก ์กฐ์ ํ๋ฉด API๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ตฌํ์ด ์ค๋จ๋ ๊ฒฝ์ฐ golang.org/x/sys/windows
์ Open
ํจ์๋ฅผ ๋ณ๊ฒฝํ ๋ค์ internal/syscall
ํจํค์ง์ ๊ณต๊ธํ ์ ์์ต๋๋ค. file_windows.go
์ฝ๋๋ ์ด๋ฏธ internal/syscall
ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ ์ผํ ๋ถ์ผ์น๋ syscall.Open
๊ฐ ์ด ํ๋๊ทธ๋ฅผ ์ดํดํ์ง ๋ชปํ์ง๋ง ๋ฎ์ ์์ค์ Windows API ๊ธฐ๋ฅ์ ์ก์ธ์คํ๋ ค๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ด์จ๋ golang.org/x/sys/windows
์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์๋ง๋ CreateFile
์ฌ์ฉํ๊ณ ์์ ๊ฒ์
๋๋ค Open
CreateFile
๋์ Open
.
syscall ํจํค์ง "์ ๊ธ"์ ์์ํ ์ ์์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช
ํฉ๋๋ค.
_์ฝ์ด ์ ์ฅ์๋ go.sys ํจํค์ง์ ์์กดํ์ง ์์ต๋๋ค_
๋ฐ๋ผ์ x/sys๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ os.OpenFile() ํธ์ถ์์๊ฒ ๋์์ด ๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ internal/syscall์ Open()์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ os.OpenFile()์ ์ด๋ฅผ ํธ์ถํฉ๋๋ค.
@maruel , Docker ํ๋ก์ ํธ ๋ฐ ์๋ง๋ ๋ค๋ฅธ ๋ง์ ์ฌ๋๋ค์ ์ด๋ฆฐ ํ์ผ์ os.Rename() ๋ฐ .Remove()์ ๋ํ Unix ๋์์ ๊ฐ์ ํ์ต๋๋ค. ํจํค์ง "os"๊ฐ Windows ๊ด๋ จ ๋์์ ์ธ๊ธํ์ง ์์์ง๋ง ์์ง __15๊ฐ์ ์ธ๊ธ__์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค๋ฅธ Windows ๋์.
ํต์ฌ ๋ฆฌํฌ์งํ ๋ฆฌ๋ go.sys ํจํค์ง์ ์์กดํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ internal/syscall์ Open()์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ os.OpenFile()์ ์ด๋ฅผ ํธ์ถํฉ๋๋ค.
@networkimprov ์ , internal/syscall
๊ฐ golang.org/x/sys
์ ๊ณต๊ธ์
์ฒด ํ์ ์งํฉ์ด๋ผ๋ ์๋ชป๋ ์ธ์์ ๋ฐ์์ง๋ง ์ด๋ ์ชฝ์ด๋ ๊ทธ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ ๋ต์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค( internal/syscall/windows.Open
). ๋ฌผ๋ก ์ด๊ฒ์ syscall.Open
์ ๋์์ด ์ ์ง๋ก ์ธํด ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๊ฐ์ ํ์ ์์ต๋๋ค. ์ด์์ ์ผ๋ก๋ golang.org/x/sys/windows.Open
ํด๋น ๋ณ๊ฒฝ์ผ๋ก ์ ์ฌ์ ์ผ๋ก ์ง์ ์์ ๋ ์ ์์ต๋๋ค.
syscall ํจํค์ง๊ฐ ๊ณ ์ ๋์ด ์์ง๋ง ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ฑฐ๋ ์ฌ๊ฐํ ๊ฒฐํจ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ํนํ os ํจํค์ง๋ฅผ ๋ ์ ์ง์ํ๋๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๋๋ค์ด syscall.Open
์ง์ ํธ์ถํ๋ ๊ฒฝ์ฐ syscall ํจํค์ง๊ฐ ์๋๋ผ x/sys/windows ํจํค์ง๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๋๋ค์ด
syscall.Open
์ง์ ํธ์ถํ๋ ๊ฒฝ์ฐ syscall ํจํค์ง๊ฐ ์๋๋ผ x/sys/windows ํจํค์ง๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
syscall.Open
์ง์ ํธ์ถํ๋ ค๋ ์ฌ๋์ ์๋ฌด๋ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. os.OpenFile
๊ธฐ์ด๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํ ๋ก ์ ๋์์ผ ๋ฟ์
๋๋ค( syscall.Open
์ FILE_SHARE_DELETE
์ ๋ํ ์ง์ ์ถ๊ฐ syscall.Open
๋ os.OpenFile
์ ํจ๊ป ํ๋๊ทธ ์ฌ์ฉ์ ๋ํ ์ง์์ ์ถ๊ฐํฉ๋๋ค.
๊ฐ์ฌ ํด์. os ํจํค์ง์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ง์ํ๋๋ก syscall ํจํค์ง๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค.
@ianlancetaylor ์ @
์ธ ๋ฒ์งธ ์์ ์ @networkimprov ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋์ง๋ง ์ด๋ฌํ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง์ ๋ฌธ์๋ฅผ ๋ณด์ฆํ ๋งํผ ์ถฉ๋ถํ ๋ฏธ๋ฌํ๋ค๋ ๋ฐ
์น์ธ์ด ๋๋ค๋ฉด ๊ธฐ๊บผ์ด ๊ธฐ์ฌํ๊ฒ ์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ถ๋ช ํ Windows ๊ณ ์ ์ ์ด๋ฆ์ ๊ฐ์ง ํธ์ถ๋ณ ํ๋๊ทธ๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค.
์๋ก์ด os.Open ํ๋๊ทธ๋ฅผ ์ ์ํ์๊ฒ ์ต๋๊น? ๊ทธ๋ฐ ๋ค์ ํ๋๊ทธ๋ ๋ชจ๋ OS์์ ์ง์๋์ด์ผ ํฉ๋๋ค. ์ฆ, OS ํจํค์ง์ ์์ ์ OS ๋ ๋ฆฝ์ ์ด์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํด๋น ํ๋๊ทธ์ ์๋ฏธ๋ ๋ฌด์์ ๋๊น? ๊ทธ๋ฆฌ๊ณ ํ๋๊ทธ๊ฐ ๋ฌธ์ํ๋ ๋๋ก ์๋ํ๋์ง ํ์ธํ๋ ๋ช ๊ฐ์ง ์๋ก์ด ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
syscall ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทํ์ ์ฝ๋๊ฐ ๋ค๋ฅธ Windows ํ๋ก๊ทธ๋จ๊ณผ ์ ๊ณต์กดํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํน๋ณํ ์ํฉ์์๋ ๊ด์ฐฎ์ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ฌ๋๋ค์ด ์ด ๊ธฐ๋ฅ์ ๊ฐ๋ณ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค.
์๋ ์ค
@alexbrainman
์ด๊ฒ์ ๋ด์ฃผ์ธ์
@alexbrainman
์ด๊ฒ์ ๋ด์ฃผ์ธ์
๋๋ ๋ณด์๋ค. ์ ์ํ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ค๋ฅธ OS์์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์ง ์ ์ ์์ต๋๊น? ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌํํ๋ ค๋ฉด ์ด๋ค ํ ์คํธ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๊น?
์๋ ์ค
์ด๊ฒ์ ์ธ์ฉ
DELETE_WHEN_FREED๋ env์ ๊ฒฝ์ฐ 0์ด ๋ ์๋ ์์ต๋๋ค. ์ฐฝ ์ด์ธ์
๋ฐ๋ผ์ ๋ค๋ฅธ OS์์ ํ
์คํธํ ํ์๊ฐ ์์ผ๋ฉฐ ๋ค์์ ํธ์ถํฉ๋๋ค.
fd, ์ค๋ฅ := os.OpenFile(๊ฒฝ๋ก, os.O_RDWR|os.O_CREATE|os.DELETE_WHEN_FREED, 0600)
Windows์์ const๋ฅผ 4 ๋ก ๋ณํํฉ๋๋ค.
fd, ์ค๋ฅ := os.OpenFile(๊ฒฝ๋ก, os.O_RDWR|os.O_CREATE| 4 , 0600)
๋ค๋ฅธ ์ฌ๋๋ค ( 0 )
fd, ์ค๋ฅ := os.OpenFile(๊ฒฝ๋ก, os.O_RDWR|os.O_CREATE| 0 , 0600)
๋ค๋ฅธ OS์์ ํ ์คํธํ ์ฌํญ ์์
Windows์์๋ง ์ฌ์ฉํ ์ ์๋ ์๋ก์ด os ํจํค์ง const ๋๋ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
c:\>go doc os
package os // import "os"
Package os provides a platform-independent interface to operating system
functionality.
...
The os interface is intended to be uniform across all operating systems.
Features not generally available appear in the system-specific package
syscall.
์๋ ์ค
Alex ๊ทํ์ ์ด์ ์ ๊ธฐ์ ๋ํ ๋ต๋ณ์ https://github.com/golang/go/issues/32088#issuecomment -494157514์ ์ฒ์ ์ธ๊ธ๋์์ต๋๋ค.
์ํ์ ์ฌ์ํ๋ค
_, err := os.OpenFile(path, os.O_CREATE | syscall.FILE_SHARE_DELETE, 0);
err = os.Rename(path, path+"2")
๋๊ตฐ๊ฐ๊ฐ ํจ์น๋ฅผ ์ ์ถํ ์ ์๋ ์์ ์ ์์ต๋๋ค. @ianlancetaylor ๊ฐ ์๋ฝํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
#32188์ ์ผ๋ถ๋ก FILE_SHARE_DELETE
์ค์ ์ ์กฐ์ฌํ์ง๋ง ์ค์ ํด๋ os.Rename
๋ฐ io.ReadFile
ํธ์ถ์ ์ค๋ฅ ๋น์จ์ด ๊ฒฝํ์ ์ผ๋ก ๊ฐ์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด์จ๋ ์ฌ์๋ ๋ฃจํ๋ ์ฌ์ ํ ํ์ํ์ต๋๋ค.
๋๋ ๊ทธ ์๋ฏธ๋ฅผ ์ค์ค๋ก ์ดํดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ์๋นํ ์ฐจ์ด๋ฅผ ๋ณด์ด๋ ํ ์คํธ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
๋ช ๋
์ ์ FILE_SHARE_DELETE๋ฅผ ์คํํ๋๋ฐ ์ ๋๋ก ์๋ํ์ต๋๋ค.
๋ค๋ฅด๊ฒ.
๋ด Windows ํ๊ฒฝ์ ๋ค์ ์์ํ ์ ์์ต๋๋ค. ๋์์ด ๋๋ค๋ฉด ์ฐพ์๋ณด๊ณ ,
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ~Go 1.3 ์ ๋์ผ ๊ฒ์
๋๋ค.
2019๋
6์ 10์ผ ์์์ผ, 17:44, Bryan C. Mills [email protected]
์ผ๋ค:
#32188์ ์ผ๋ถ๋ก FILE_SHARE_DELETE ์ค์ ์ ์กฐ์ฌํ์ต๋๋ค.
https://github.com/golang/go/issues/32188 , ํ์ง๋ง ์ค์ ์ ์ฐพ์์ต๋๋ค.
os.Rename ๋ฐ
io.ReadFile ํธ์ถ; ์ด์จ๋ ์ฌ์๋ ๋ฃจํ๋ ์ฌ์ ํ ํ์ํ์ต๋๋ค.๋๋ ์ค์ํ
์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ๋์ ๋๋ ์ฐจ์ด์ ์
๊ทธ ์๋ฏธ๋ฅผ ์ค์ค๋ก ์ดํดํ์ญ์์ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=ABNEY4VVIVJ2IEWQPWCWBZTPZZSETA5CNFSM4HNPNYIKYY3PNVWYWK3TUL52HS4DFVREXG43VMVBW63LDNCGX
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABNEY4STTW7U526HPO6TUHDPZZSETANCNFSM4HNPNYIA
.
@bcmills , #32188 ์ฝ๊ธฐ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๋์ _์ด๋ฆฌ์ง ์์_ ํ์ผ์ os.Rename()์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๊ณ ์๊ณ ์์ต๋๊น? ๋ชจ๋ ๋๋ ํฐ๋ฆฌ ๋ณ๊ฒฝ ์์ ์ ๋ํด ์์ฑ๋ NTFS ์ ๋์ ๋ฅ๊ฐํ์ฌ ์ค๋ฅ๋ฅผ ์ ๋ฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ์ด๋ค ์ค๋ฅ๊ฐ ์์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
syscall.Open()์์ FILE_SHARE_DELETE๋ฅผ ํ์ฑํํ๊ธฐ ์ํ ์์ฒญ์ ์ด๋ฆฐ ํ์ผ์์ os.Rename()์ด ์๋ํ๋๋ก ํ์ฉํ๋ ๊ฒ์ ๋๋ค. Win7์์ 1.12๋ก ํด๋น ํ๋๊ทธ๋ฅผ ํ ์คํธํ๋๋ฐ ์๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ์์ด๋ ์คํจํฉ๋๋ค.
๋๋ "๋ก๋ ์ค" ์ฐฝ์์ os.Rename()์ ํน๋ณํ ํ ์คํธํ์ง ์์์ง๋ง fsd๋ฅผ ํ์ฑํํ ์ดํ ์ด๋ฆฐ ํ์ผ์์ os.Rename()์์ ์๊ธฐ์น ์์ ์ค๋ฅ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ณด๊ณ ํ๊ฒ ์ต๋๋ค.
์ด๋ฆ์ ๋ฐ๊พธ๋ ๋์ ์ด๋ฆฌ์ง ์์ ํ์ผ์ os.Rename()์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค.
์.
์ด๋ค ์ค๋ฅ๊ฐ ์์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ฒฝํ์ ์ผ๋ก ๋ด๊ฐ ๋ณด๊ณ ์๋ ์ค๋ฅ(from MoveFileEx
, ReplaceFile
๋ฐ/๋๋ CreateFile
)๋ ERROR_ACCESS_DENIED
, ERROR_SHARING_VIOLATION
, ๋ฐ ERROR_FILE_NOT_FOUND
.
syscall.Open()์์ FILE_SHARE_DELETE๋ฅผ ํ์ฑํํ๊ธฐ ์ํ ์์ฒญ์ ์ด๋ฆฐ ํ์ผ์์ os.Rename()์ด ์๋ํ๋๋ก ํ์ฉํ๋ ๊ฒ์ ๋๋ค. Win7์์ 1.12๋ก ํด๋น ํ๋๊ทธ๋ฅผ ํ ์คํธํ๋๋ฐ ์๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ ์์ด๋ ์คํจํฉ๋๋ค.
์ค๋ฅธ์ชฝ; ๋ด๊ฐ ํด๊ฒฐํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๊ณ ์์ด ๊ด๋ จ ๋ฌธ์ ์ ๋ํ ๋์ ํตํ๊ฐ ๊ฐ๋ฅํ๋๋ก๋์ด os.Rename
์ฑ๊ณตํ๊ณ , ํธ์ถ ํ ์ ์๋๋ก io.ReadFile
์ ๋์ os.Rename
์ฑ๊ณตํ๊ธฐ๋ฅผ. ๊ธฐ์กด ํธ๋ค์ ์ฐ ์ํ๋ก ์์
ํ๊ธฐ ์ํด ๋จ์ผ os.Rename
๋ฅผ ์ป๋ ๊ฒ์ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ๋จ๊ณ์ผ ์ ์์ง๋ง POSIX rename
๋ฅผ ์ฌ์ฉํ๋ ์ ํ์ ์ฌ์ฉ ์ฌ๋ก์๋ ์ถฉ๋ถํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๊ทธ ์๋ฏธ๋ฅผ ์ค์ค๋ก ์ดํดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ์๋นํ ์ฐจ์ด๋ฅผ ๋ณด์ด๋ ํ ์คํธ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
@bcmills PowerShell ์์ ๋ Go๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ์์ฑํฉ๋๋ค.
New-Item -Type Directory -Path C:\folder1
for($i=0; $i -le 1000; $i++)
{
$temp = [System.IO.File]::Open("C:\folder1\test.txt", "Create", "ReadWrite", "Delete")
Set-Variable -Name "file$i" -Value $temp -Force
$TempName = "C:\folder1\test.txt." + (New-Guid).Guid
Rename-Item -Path C:\folder1\test.txt -NewName $TempName
Remove-Item -Path $TempName -Force
}
์๋ฃ๋๋ฉด C:\folder1
์๋์ ์ฒ ๊ฐ์ test.txt.???
ํ์ผ์ด ์์ง๋ง PowerShell์ ๋ซ์ผ๋ฉด ํด๋น ํ์ผ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
๋ฐ๋ผ์ FILE_SHARE_DELETE
ํ๋๊ทธ๊ฐ ์ค์ ๋ก ์ด๋ ค ์๋ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋/์ด๋/์ ๊ฑฐํ ์ ์๋๋ก ํ์ง๋ง ํธ๋ค์ด ์ด๋ ค ์๋ ํ ๋์คํฌ์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋์ ํ์ผ ์ด๋ฆ์ด ๊ณ ์ ํ์ง ํ์ธํด์ผ ํฉ๋๋ค.
"POSIX ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ์ฌ์ฉ"์ Windows์์ ๋ถ๊ฐ๋ฅํ๋ฉฐ ์๋ง๋ ์ด๊ฒ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ด์ ์ผ ๊ฒ์ ๋๋ค.
ํฌ์์ค :
ํ์ผ "filename" ์์ฑ
"ํ์ผ ์ด๋ฆ"์์ ์ฝ๊ธฐ/์ฐ๊ธฐ
"ํ์ผ ์ด๋ฆ" ์ญ์
ํ์ผ "filename" ์์ฑ
...
"ํ์ผ ์ด๋ฆ" ์ญ์
๊ฐ ์์ฑ ํ์ผ์ diff fd๊ฐ ์์ผ๋ฏ๋ก ์๋ํฉ๋๋ค.
์๋์ฐ:
ํ์ผ "filename" ์์ฑ
"ํ์ผ ์ด๋ฆ"์์ ์ฝ๊ธฐ/์ฐ๊ธฐ
"ํ์ผ ์ด๋ฆ" ์ญ์
ํ์ผ "filename" ์์ฑ - ๋ถ, ๊ณต์ ์๋ฐ
์ฌ๊ตฌ์ฑํ๊ธฐ๊ฐ ๋งค์ฐ ์ฌ์์ผํฉ๋๋ค ...
๊ทธ๋ฌ๋ฉด FILE_SHARE_DELETE๋ ๋ฌด์์ ํ ์ ์์ต๋๊น?
ํ์ผ์ด ์ด๋ ค ์๋ ๋์ ์ง์ฐ๋ ์ญ์ ๋ฅผ ํ์ฉํฉ๋๋ค.
๊ทธ๊ฒ ๋ค์ผ
2019๋
6์ 10์ผ ์์์ผ, 19:32, Olli Janatuinen [email protected]
์ผ๋ค:
๋๋ ์ค์ํ
์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ๋์ ๋๋ ์ฐจ์ด์ ์
๊ทธ ์๋ฏธ๋ฅผ ์ค์ค๋ก ์ดํดํ์ญ์์ค.@bcmills https://github.com/bcmills ๋ด๊ฐ ์ฐ๋ PowerShell ์์
Go๋ณด๋ค ํจ์ฌ ๋น ๋ฆ์ ํญ๋ชฉ ์ ํ ๋๋ ํ ๋ฆฌ -๊ฒฝ๋ก C:folder1for($i=0; $i -le 1000; $i++)
{
$temp = [System.IO.File]::Open("C:folder1test.txt", "๋ง๋ค๊ธฐ", "์ฝ๊ธฐ ์ฐ๊ธฐ", "์ญ์ ")
๋ณ์ ์ค์ - ์ด๋ฆ "file$i" -๊ฐ $temp -Force
$TempName = "C:folder1test.txt." + (New-Guid).Guid
ํญ๋ชฉ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ - ๊ฒฝ๋ก C:folder1test.txt -NewName $TempName
ํญ๋ชฉ ์ ๊ฑฐ - ๊ฒฝ๋ก $TempName -Force
}์๋ฃ๋๋ฉด ์ฒ ๊ฐ์ test.txt๊ฐ ์์ ๊ฒ์ ๋๋ค.??? ์๋์ ํ์ผ
C:folder1์ด์ง๋ง PowerShell์ ๋ซ์ผ๋ฉด ํด๋น ํ์ผ์ด ์ ๊ฑฐ๋ฉ๋๋ค.๋ฐ๋ผ์ ์ค์ ๋ก ์ด๋ค FILE_SHARE_DELETE ํ๋๊ทธ๊ฐ ํ์ฉํฉ๋๊น?
์ด๋ ค ์๋ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋/์ด๋/์ ๊ฑฐํ์ง๋ง ์ฌ์ ํ ๋์์ด
ํ์ผ ์ด๋ฆ์ ํธ๋ค์ด ์๋ ํ ๋์คํฌ์ ์กด์ฌํ๋ฏ๋ก ๊ณ ์ ํฉ๋๋ค.
์ด๋ ค์์ต๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=ABNEY4WSTWIUVNVHLYMBFY3PZZ62DA5CNFSM4HNPNYIKYY3PNVWWK3TUL52HS4DFVREXG43VMXVW63LDNMV
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABNEY4VS5XF3EXB6QPBWVQ3PZZ62DANCNFSM4HNPNYIA
.
์ฑ๊ณตํ๋ ค๋ฉด os.Rename๊ณผ ๋์์ io.ReadFile์ ๋ํ ํธ์ถ์ ํ์ฉํฉ๋๋ค.
@bcmills ๊ด๋ จ ์๋ ํ์ผ์์ ๋์ผํ ์ํ์ค๋ฅผ ์๋ํ๋ ๋ค๋ฅธ ์ค๋ ๋์ ๋์์ ์คํ๋์ง ์๋๋ค๋ ๊ฐ์ ํ์ ํญ์ fsd ํ๋๊ทธ ์ธํธ๋ก ์์ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ์ ์ผ๋ก ํ๋๊ทธ ์์ด๋ ์คํจํด์ผ ํฉ๋๋ค.
ํ ์คํธ ์คํฌ๋ฆฝํธ์ ํด๋น ์ธก๋ฉด์ Windows syscall.Open()์์ ๋ฒ๊ทธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ๊ฒฌํ์ต๋๋ค. ํ์ง๋ง ์ด ์ค๋ ๋์ ๋๊ธ์ ๋ฌ๊ณ ์๋ ์ฌ๋์ ์๋ฌด๋ ์์ ์ ์ํ์ง ์์ต๋๋ค.
TLDR:
syscal_windows.go์ ๋ํ ์ฌ์ํ ์์ ๋ณ๊ฒฝ ๋ฐ ์์๋๋ก ์๋ํฉ๋๋ค.
์ค๋ช
:
๊ทธ๋์, ์ฌ๊ธฐ ๋ด๊ฐ ํ ์ผ์ด ์๊ณ , ์์๋๋ก ์๋ํ๋ฉฐ, ์ํ์ด ์์ต๋๋ค(IMO).
func Open(path string, mode int, perm uint32) (fd Handle, err error) {
sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | (mode & FILE_SHARE_DELETE))
์ถ๊ฐ: "| (๋ชจ๋ & FILE_SHARE_DELETE)"
๊ฐ๋ฐ์๊ฐ ๋ชจ๋ ๋ฐ 4 ์ธํธ๋ฅผ ๋ณด๋ด์ง ์๋ ๊ฒฝ์ฐ(์ ๊ทธ๋ ์ด์ ์๋ ์๋ํ์ง ์์๋์ง...) - ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝ๋์ง ์์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋
os.OpenFile(filename,os.O_RDWR|os.O_CREATE, 0600)
๋ณ๊ฒฝ ์ ๊ณผ ๋์ผํ๊ฒ ์๋ํ๋ฉฐ, ๋ค์์ ์ํํ๋ ๊ฐ๋ฐ์๋ง
os.OpenFile(filename,os.O_RDWR|os.O_CREATE | 4 , 0600)
๋ณํ๋ฅผ "๋๋" ๊ฒ์ ๋๋ค
package main
import (
"fmt"
"os"
)
func main() {
filename := "./myfile"
if f ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
fmt.Printf("Open file %s error : %s" , filename, err.Error())
} else if _,err:= f.WriteString("bla bla") ;err!=nil{
fmt.Printf("writing to %s returned error : %s" , filename, err.Error())
} else if err := os.Remove(filename);err!=nil{
fmt.Printf("removing %s returned error : %s" , filename, err.Error())
}
}
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํจ๊ณผ๊ฐ ์์๋ค
package main
import (
"fmt"
"os"
)
func main() {
filename := "./myfile"
if f ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
fmt.Printf("Open file %s error : %s" , filename, err.Error())
} else if _,err:= f.WriteString("bla bla") ;err!=nil{
fmt.Printf("writing to %s returned error : %s" , filename, err.Error())
} else if err := os.Remove(filename);err!=nil{
fmt.Printf("removing %s returned error : %s" , filename, err.Error())
} else if secondF ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
fmt.Printf("reOpen file %s error : %s" , filename, err.Error())
} else {
secondF.Close()
}
}
๋ฌผ๋ก ๋ ๋ฒ์งธ F์์ ์คํจํ์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ Windows์์ ์์๋๋ ๋์์
๋๋ค. "๋ก๋ ํ
์คํธ"ํ ํ์๊ฐ ์์ต๋๋ค. ์ง์ฐ๋ .Remove์๋ ๋์์ฑ ์ต์
์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์์ํค์ง ์๊ณ ์ด ์ ๋ฐ ์ค ์ syscal_windows์ ์์ ํ๊ฒ ์ถ๊ฐํ ์ ์๋ค๊ณ ์๊ฐ ํฉ๋๋ค. ์ญ์ ๋ฅผ ์ฐ๊ธฐํ ์
์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ๋ชจ๋ ๊ฒ(๊ตต์ ๊ธ์จ):
syscal_windows.go:
๊ณต์ ๋ชจ๋ := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | (๋ชจ๋ ๋ฐ FILE_SHARE_DELETE) )
#32188์ ์ผ๋ถ๋ก
FILE_SHARE_DELETE
์ค์ ์ ์กฐ์ฌํ์ง๋ง ์ค์ ํด๋os.Rename
๋ฐio.ReadFile
ํธ์ถ์ ์ค๋ฅ ๋น์จ์ด ๊ฒฝํ์ ์ผ๋ก ๊ฐ์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด์จ๋ ์ฌ์๋ ๋ฃจํ๋ ์ฌ์ ํ ํ์ํ์ต๋๋ค.๋๋ ๊ทธ ์๋ฏธ๋ฅผ ์ค์ค๋ก ์ดํดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๋ ๊ฒ๊ณผ ์๋นํ ์ฐจ์ด๋ฅผ ๋ณด์ด๋ ํ ์คํธ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
@bcmills๋ ์ด์ https://github.com/olljanat/go/commit/3828f1a5d0ebb69b4c459d5243799ded36ac1ee8 ์์ ์ด์ ๋ํ ๋จ์/ํ๊ท ํ
์คํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ํ์ฌ Windows์์ The process cannot access the file because it is being used by another process.
์ค๋ฅ์ ์คํจํ๊ณ FILE_SHARE_DELETE
์ดํ์ ์์
์ ์์ํฉ๋๋ค
๋ฉ๋ชจ! Windows์์ ์ฌ์ ํ ์ด๋ ๋ก๊ทธ์ธ ํด๋น ๋จ๊ณ ํ์ example.log.1
๋ค๋ฅธ ์ด์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ์์ / ๊ณ ์ ํ ์ด๋ฆ์ผ๋ก ํ์ผ์ example.log
์ example.log.1
์ ์คํจ Access is denied.
์ค๋ฅ FILE_SHARE_DELETE
ํ๋๊ทธ๊ฐ ํ์ฑํ๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ์ฒ๋ฆฌํด์ผ ํ๋ ํ๋ซํผ๋ณ ์ฌํญ์
๋๋ค.
/cc @jhowardmsft @jterry75 @jstarks @ddebroy ์ฐธ๊ณ ๋ก; ๋น์ ๋ ์ด๊ฒ์ ๊ด์ฌ์ด ์์ ์ ์์ต๋๋ค.
@kevpar- ์ฐธ๊ณ ๋ก ๋น์ ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค๋ ๋์ ์ฐธ์ฌํ๋ ์ฌ๋๋ค์ด os.OpenFile()์์ Windows ์ ์ฉ ํ๋๊ทธ๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ ์ด๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํด์ผ ํ๋ ์ด์ (์: ๊ธฐ์กด ์ฝ๋๊ฐ ์์๋จ)๋ฅผ ๋งํ ์ ์๋ ๊ฒฝ์ฐ ํ์ดํ ์ ํ์ญ์์ค!
@networkimprov IMO ๊ฐ๋ฐ์๋ ๋ด ๋ก๊ทธ ํ์ ์์ ์ ๊ฐ์ด ๋ค๋ฅธ Windows ๊ด๋ จ ์ฌํญ๋ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ Windows ์ ์ฉ ํ๋๊ทธ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ด๊ฐ ๋ณผ ์ ์๋ฏ์ด ๋ ๋ช ์ Microsoft ์ง์์ด ํ ๋ก ์ ์ด๋๋์์ผ๋ฏ๋ก ๊ทธ๋ค์ด ์ด๊ฒ์ ๋ค๋ฅด๊ฒ ์๊ฐํ๋์ง ๋ณด๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
btw๊ฐ ์ด์ ๋ํ ์๋ก์ด ์๋ฃจ์ ์ ๊ฐ๋ฐํ๊ธฐ ์์ํ ์ฌ๋์ด ์์ต๋๊น? ์์ ๋ด์ฌ์๊ฐ ์์ต๋๊น?
@oljanat
ํ๋๊ทธ๋ก ์์ ํ๋ ๊ฒฝ์ฐ ์์ ์ฌํญ์ ํ๋์ ๋ผ์ด๋์
๋๋ค. ๋ค์์ ์ฝ์ผ์ญ์์ค.
https://github.com/golang/go/issues/32088#issuecomment -500562223
์ฌ๊ธฐ์์ Windows ํ์ ๊ด์ ์ ํํํ๋ ค๊ณ ํฉ๋๋ค. ์ต์ ์์ด ํญ์ FILE_SHARE_DELETE๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Windows๋ก/์์ ์ฝ๊ฒ ํฌํ ํ ์ ์๋๋ก Linux์์ ์ผ๊ด๋ ๋์์ ์ ํธํ๋ฉฐ Windows ์ฌ์ฉ์ ๋๋ ์ํํธ์จ์ด๊ฐ ๊ท์น์ ์์ธ๊ฐ ๋๊ธฐ์ ์ถฉ๋ถํ ๊ธฐ๋ณธ !FILE_SHARE_DELETE ๋์์ ์ ํธํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@mattn ์ ์๊ฒฌ๊ณผ ๋ฌ๋ฆฌ ํฅ๋ฏธ๋ก์ด ์ฐธ๊ณ ์ฌํญ: ์ต์ ๋ฒ์ ์ Windows์์๋ "POSIX" ์ญ์ ๋ฅผ ์ํํ๋๋ก DeleteFile(NTFS์์)์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ๋ซ์ ํ์ผ์ ๋ํ ํธ๋ค์ ๋๋ค. ์ฌ์ ํ FILE_SHARE_DELETE๋ฅผ ์กด์คํ์ง๋ง ์ด์ POSIX ์ฐ๊ฒฐ ํด์ ์ ๊ฐ์ด ์๋ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ WSL์ฉ์ผ๋ก ์ถ๊ฐ๋์์ผ๋ฉฐ Windows ์ํํธ์จ์ด์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ๊ฐ์น๊ฐ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์์ต๋๋ค.
์ฆ, ์ต์ ๋ฒ์ ์ Windows์์ mattn์ ํ ์คํธ ํ๋ก๊ทธ๋จ๊ณผ del, dir ๋ฑ์ ์ํ์ค๋ฅผ ์คํํ๋ฉด ํ ์คํธ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ์งํ๊ฐ ์๋๋ผ ํ์ผ ์ญ์ ์งํ ๋ค์์คํ์ด์ค์์ ํ์ผ์ด ์ฌ๋ผ์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋ง์น ๋ฆฌ๋ ์ค์ฒ๋ผ.
๋ฐ๋ผ์ Windows ์์ฒด์์๋ ์ฑ ํธํ์ฑ ์ํ์ด ํจ์ฌ ๋ ํฌ์ง๋ง Windows๊ฐ ์๋ ์ํํธ์จ์ด๋ฅผ Windows๋ก ์ฝ๊ฒ ์ด์ํ ์ ์๋๋ก ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ ๊ฐํ๊ณ ์์ต๋๋ค. ๋๋ Go๊ฐ ๊ทธ๋ ๊ฒ ํ๋๋ก ์ ๋ง๋ก ๊ฒฉ๋ คํ๋ค.
@jstarks , ์ ๋ฅผ
Windows ๋ฐฐํฌ๊ฐ ํ์ฌ ๋ฌธ์ํ๋์ง ์์ ๋์์ ์์กดํ๋ ๊ฒฝ์ฐ fsd๋ฅผ ๋นํ์ฑํํ๋ ์ ์ญ ์ต์ ์ ์ ์ํฉ๋๋ค.
@ianlancetaylor ๋์ํ์ญ๋๊น?
CreateFile์ ๊ธฐ๋ณธ ๋์์ ์ฌ๋ ํ์ผ์ ์ญ์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ฏ๋ก ๊ธฐ๋ณธ ๋์์ ์ ์งํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๊ตฐ๊ฐ๋ ์๋์ ํ๋์ ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ผ์ ์ญ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ํ๋์ง ํ์ธํ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ ์ ์์ต๋๋ค.
Python์ ๋์์ ํ์ฌ Go์ ๋์๊ณผ ๋์ผํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ฌ์ด ์ด๋ฆฐ ํ์ผ์ ์ญ์ ํ ์ ์๋ ๋์์ ๋ณ๊ฒฝํ ๊ณํ์ด ์๋ค๋ ์์์ ๋ค์ด๋ณธ ์ ์ด ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํด ์ง์งํ ์๊ฒฌ์ ๋ผ ์๊ฐ์ ์์์ง๋ง ๊ธ๋ก๋ฒ ์ต์ ์ด ์ข์ ์ ํ์ด๋ผ๊ณ ๋ ์๊ฐํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ์ฌ ๋์์ ์ ์งํด์ผ ํ๊ฑฐ๋(์๋ง๋ ๋ค๋ฅธ ๋์์ ์ ํํ๊ธฐ ์ํด ํ๋๊ทธ๋ฅผ ์ถ๊ฐํด์ผ ํจ) ๋์์ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค(์๋ง๋ ์๋์ ํ์ฌ ๋์์ ์ ํํ๊ธฐ ์ํด ํ๋๊ทธ๋ฅผ ์ถ๊ฐํด์ผ ํจ).
๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ ์ง ์ฌ๋ถ์ ๊ด๋ จํ์ฌ ์ฐ๋ฆฌ๋ ๋์์ ๋ณ๊ฒฝํ๋ฉด Unix ๋ฐ Windows ์์คํ ์์ ์คํ๋๋๋ก ์์ฑ๋ Go ํ๋ก๊ทธ๋จ์ด ์์ ๋ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์์ง ๋๋ ๋์์ ๋ณ๊ฒฝํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์์ง ์ง๋ฌธํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Windows ์์คํ ์์ ์คํ๋๋๋ก ์์ฑ๋ Go ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ํ ๋ต์ ๋ชจ๋ฅธ๋ค.
@mattn์ด ์ ์ํ ๊ฒ์ฒ๋ผ ๋ค๋ฅธ ์ธ์ด๊ฐ ๋ฌด์์ ํ๋์ง ๋ฌป๋ ๊ฒ๋ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ด๊ฒ์ด ๊ธฐ๋ณธ๊ฐ์ด ๋๊ณ ๋ชจ๋ Windows ๋ฐฐํฌ๊ฐ ์ด์ ์์กดํ๋ค๋ฉด os.OpenFile() ํ๋๊ทธ์ ๊ณผ๋๊ธฐ๋ฅผ ์ํด ๋ค์ ์ ํํ๋ ์ ์ญ ์ต์ ์ ๋ชจ๋ ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ํ์ธํ IPv6์ ๋นํ์ฑํํ๋ ์ ์ญ ์ต์ ์ด ์์ต๋๋ค.
์ํฅ์ ๋ฐ๊ฒฌํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ ๋ณ๊ฒฝํ๊ณ (๋ธ๋ก๊ทธ์ ๋ฐํ?) ๋ณด๊ณ ๋ ๋ด์ฉ์ ํ์ธํ๋ ๊ฒ์ ๋๋ค.
๋ฌธ์ ํ
์คํธ์๋ Python๊ณผ Erlang์ด ๋ชจ๋ ์ธ๊ธ๋์ด ์์ต๋๋ค.
Erlang์ 6๋
์ ์ ์ด๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ์ต๋๋ค: erlang/ otp@0e02f48
Python์ MSVC ๋ฐํ์์ ์ ํ์ผ๋ก ์ธํด ์ํ์ง๋ง ํ ์ ์์์ต๋๋ค. https://bugs.python.org/issue15244
์ฌ๊ธฐ์์ Windows ํ์ ๊ด์ ์ ํํํ๋ ค๊ณ ํฉ๋๋ค. ์ต์ ์์ด ํญ์ FILE_SHARE_DELETE๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Windows๋ก/์์ ์ฝ๊ฒ ํฌํ ํ ์ ์๋๋ก Linux์์ ์ผ๊ด๋ ๋์์ ์ ํธํ๋ฉฐ Windows ์ฌ์ฉ์ ๋๋ ์ํํธ์จ์ด๊ฐ ๊ท์น์ ์์ธ๊ฐ ๋๊ธฐ์ ์ถฉ๋ถํ ๊ธฐ๋ณธ !FILE_SHARE_DELETE ๋์์ ์ ํธํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ต์ ๋ฒ์ ์ Windows์์๋ "POSIX" ์ญ์ ๋ฅผ ์ํํ๋๋ก DeleteFile(NTFS์์)์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ์ฌ๊ธฐ์ ํ์ผ์ ๋ํ ์ด๋ ค ์๋ ๋ชจ๋ ํธ๋ค์ด ๋ซํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ํ์ผ์ด ๋ค์์คํ์ด์ค์์ ์ฆ์ ์ ๊ฑฐ๋ฉ๋๋ค. ์ฌ์ ํ FILE_SHARE_DELETE๋ฅผ ์กด์คํ์ง๋ง ์ด์ POSIX ์ฐ๊ฒฐ ํด์ ์ ๊ฐ์ด ์๋ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ WSL์ฉ์ผ๋ก ์ถ๊ฐ๋์์ผ๋ฉฐ Windows ์ํํธ์จ์ด์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ๊ฐ์น๊ฐ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์์ต๋๋ค.
@jstarks ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ์ธ๋ถ ์ฌํญ์ ๋๋ค. Microsoft๊ฐ ์ด์ OS ๋ฒ์ ์ผ๋ก๋ ๋ฐฑํฌํ ํ ๊ฒ์ผ๋ก ์์ํ ์ ์์ต๋๊น? ํนํ ์ต๊ทผ์ ์ถ์๋ LTSC ๋ฒ์ ์ธ Windows Server 2019๋ ์์ผ๋ก๋ ์ค๋ซ๋์ ์ง์๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
Microsoft๊ฐ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ฒ๋ผ Go์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก FILE_SHARE_DELETE๋ฅผ ํ์ฑํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
Java, C# ๋ฐ ๋ด๊ฐ ์๊ณ ์๋ ๋ค๋ฅธ ๋ชจ๋ ์ฃผ์ ์ธ์ด๋ ๊ธฐ๋ณธ OS ๋์์ ์ฌ์ฉํฉ๋๋ค. ์ ์๊ฐ์๋ ๊ธฐ๋ณธ ๋์์ OS ๊ตฌํ์์๊ฒ ๋งก๊ฒจ์ผ ํฉ๋๋ค. Windows๊ฐ ํ์ผ ์ด๊ธฐ์ ๊ด๋ จํ์ฌ POSIX ์ ๊ทผ ๋ฐฉ์์ ์ค์ ๋ก ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ํด๋น ์ํ์ ๊ฐ์ํ๊ณ DeleteFile์ ๋ํด ์ํํ ๊ฒ์ฒ๋ผ ์ํํด์ผ ํฉ๋๋ค.
Go ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ณต์ ์ญ์ ํ์ผ์ ์์ฑ/์ด ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ผ ๋ชจ๋๋ฅผ ๋ค๋ฃฐ ๋ ์ค์ฉ์ ์ธ ์๋ฅผ ํ๋ ๋ค ์ ์์ต๋๋ค. Hadoop์ Windows๋ก ์ด์ํ ๋ ๊ณต์ ์ญ์ ํ์ผ ํธ๋ค ๋๋ ์คํธ๋ฆผ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด JNI์์ ํน๋ณํ ๋ฉ์๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ถ๊ฐ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค.
@jstarks
๋งํ ๋
์ต์ ๋ฒ์ ์ Windows์์๋ ํ์ผ์ด ๋ค์์คํ์ด์ค์์ ์ฆ์ ์ ๊ฑฐ๋๋ "POSIX" ์ญ์ ๋ฅผ ์ํํ๋๋ก DeleteFile(NTFS์์)์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
์ด๋ฆฐ ํ์ผ์ด fd ๋ฐ ์๋ ์ฝ๋๋ก๋ง ์ ์ง๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น?
package main
import (
"fmt"
"os"
)
func main() {
filename := "./myfile"
if f ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
fmt.Printf("Open file %s error : %s" , filename, err.Error())
} else if _,err:= f.WriteString("bla bla") ;err!=nil{
fmt.Printf("writing to %s returned error : %s" , filename, err.Error())
} else if err := os.Remove(filename);err!=nil{
fmt.Printf("removing %s returned error : %s" , filename, err.Error())
} else if secondF ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
fmt.Printf("reOpen file %s error : %s" , filename, err.Error())
} else {
secondF.Close()
}
}
์คํจํ์ง ์์ ๊ฒ์ ๋๋ค
} else if secondF ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
์ ์๋ ์์ ์ฌํญ ์ ์ ์ฉํ ํ?
๊ทธ๋ ๋ค๋ฉด ์ ๋ง ๋ฉ์ง๊ตฐ์!
๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ ์ง ์ฌ๋ถ์ ๊ด๋ จํ์ฌ ์ฐ๋ฆฌ๋ ๋์์ ๋ณ๊ฒฝํ๋ฉด Unix ๋ฐ Windows ์์คํ ์์ ์คํ๋๋๋ก ์์ฑ๋ Go ํ๋ก๊ทธ๋จ์ด ์์ ๋ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์์ง ๋๋ ๋์์ ๋ณ๊ฒฝํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์์ง ์ง๋ฌธํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Windows ์์คํ ์์ ์คํ๋๋๋ก ์์ฑ๋ Go ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ํ ๋ต์ ๋ชจ๋ฅธ๋ค.
Windows์์ Unix ํ๋ก๊ทธ๋จ์ ์คํํ๋ problem to be fixed
๋ ์์ต๋๋ค. Windows๋ Unix์ ๋ค๋ฅด๊ฒ ์ด๋ฆฐ ํ์ผ์ ์ญ์ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ํ์ผ ์ด๋ฆ์ ๋์๋ฌธ์ ๊ตฌ๋ถ๊ณผ ์ ์ฌํฉ๋๋ค. Unix๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๊ณ Windows๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. ๋ ๊ฐ์ง ์ฐจ์ด์ ์ ๋ํด ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ John์ด Microsoft๊ฐ ์ํฉ์ ๋ฐ๊พธ๋ ค๊ณ ํ๋ค๊ณ ํ์ ํ๋ ๋์ ์ ๋ ๋ณํ๊ฐ ์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ Windows ์ฌ์ฉ์๋ ์ฌ์ ํ Windows 7 ๋ฐ ๊ธฐํ ๋ชจ๋ Windows ๋ฒ์ ์ ์ฌ์ฉํฉ๋๋ค. John๋ Windows 7์ ์ ๋ฐ์ดํธํ์๊ฒ ์ต๋๊น?
Microsoft๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ฒ๋ฆฌํ๋๋ก ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Go ์ฌ์ฉ์๋ฅผ ์์ ํด๋ Go๊ฐ ์๋ ๊ฐ๋ฐ์๋ ๊ณ์ ๋จ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ Microsoft๋ ์ด์ ๊ด๊ณ์์ด ์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋ํ FILE_SHARE_DELETE์๋ ์์ฒด ๋ฐ์ด์ฌ๋ฆฐ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด https://bugs.python.org/issue15244 ์ฝ๊ธฐ
์ค์ ๋ก Unix์ ์๋ฏธ๊ฐ ์์ ํ ๊ฐ์ง๋ ์์ต๋๋ค.
ํ์ผ์ ์ญ์ ํ ํ์๋ ํธ๋ค์ด ๋ซํ ๋๊น์ง ๋์ผํ ์ด๋ฆ์ ํ์ผ์ ์์ฑํ๊ฑฐ๋ ํ์ผ์ด ํฌํจ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ์ผ์ ์ญ์ ํ๊ธฐ ์ ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ๊ฐ์ ๋ค๋ฅธ ์์น๋ก ํ์ผ์ ์ด๋ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์๋ง ์ฐ๋ฆฌ๊ฐ ์์ง ๋ชปํ๋ ๊ทธ๋ฐ ์ฌ๋๋ค์ด ๋ง์ด ์์ ๊ฒ์ ๋๋ค. FILE_SHARE_DELETE๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก FILE_SHARE_DELETE๋ฅผ ์ฌ์ฉํ๋๋ก Go ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ ๋ค์ ์ฌ์ฉ์๊ฐ ๊นจ์ง ํ๋ก๊ทธ๋จ์ ๋ํด ๋ถํํ ๋๊น์ง ๊ธฐ๋ค๋ฆด ๊ฒ์ ์ ์ํ์๊ฒ ์ต๋๊น?
@mattn์ด ์ ์ํ ๊ฒ์ฒ๋ผ ๋ค๋ฅธ ์ธ์ด๊ฐ ๋ฌด์์ ํ๋์ง ๋ฌป๋ ๊ฒ๋ ๊ฐ์น๊ฐ ์์ต๋๋ค.
Mingw C๋ง ํ์ธํ์ต๋๋ค. Go์ฒ๋ผ ์๋ํฉ๋๋ค. fopen์ผ๋ก ํ์ผ์ ์ด๋ฉด fclose๊ฐ ํธ์ถ๋ ๋๊น์ง ํ์ผ์ ์ญ์ ํ ์ ์์ต๋๋ค. Microsoft ๊ฐ๋ฐ ๋๊ตฌ(C, C++, C#, VB ๋ฑ)๊ฐ ์๋ก ๋ค๋ฅด๋ค๋ฉด ๋๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๊ทธ๋ฐ ๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ผ๋ถ ํ๋ก๊ทธ๋จ์๋ ํน์ ํ์ผ์ด ์ด๋ ค ์์ ์ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์์ ์ญ์ ํ ์ ์์ต๋๋ค. ๋ด ์๊ฐ์๋ Windows์์ ์ ํจํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์์ผ๋ก ์ง์ํด์ผ ํฉ๋๋ค.
์๋ ์ค
7๋
์ ์ ์ถ๊ฐ๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
https://sourceforge.net/p/mingw-w64/code/HEAD/tree/stable/v3.x/mingw-w64-headers/include/ntdef.h#l858
์ง๊ธ๊น์ง ๋ฌธ์ํ๋์ง ์์ ํ์ฌ Windows ๋์์ ์์กดํ๋ Go ์ฑ ์ฌ๋ก๋ฅผ ๊ฒ์ํ ์ฌ๋์ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ก ์ธํด Windows์์ ์คํจํ Go ์ฑ์ ๊ฒฝ์ฐ๋ฅผ ์ต์ 4๊ฑด ์ด์ ๋ค์์ต๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด os.Remove() ์ดํ์ ํ์ผ ์ด๋ฆ ์ฌ์ฌ์ฉ์ ๋ํ ๊ฐ๋จํ ์์ ์ฌํญ์ด ์์ผ๋ฉฐ ์ด๋ฅผ ๋ฌธ์ํํด์ผ ํฉ๋๋ค.
os.Rename(path, unique_path); os.Remove(unique_path)
์ง๊ธ๊น์ง ๋ฌธ์ํ๋์ง ์์ ํ์ฌ Windows ๋์์ ์์กดํ๋ Go ์ฑ ์ฌ๋ก๋ฅผ ๊ฒ์ํ ์ฌ๋์ ์์ต๋๋ค.
์ด ์ฌ๋๋ค์ Go ๋ฒ๊ทธ๋ฅผ ๋ณด๊ณ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ์ฌ์ค์กฐ์ฐจ ๋ชจ๋ฆ ๋๋ค.
์ด๋ฌํ ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ง ๋ฌธ์ ๋ชฉ๋ก์ ๋ชจ๋ํฐ๋งํ์ฌ ์ํฅ์ ์ค ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋ค์๊ฒ๋ ์ด ์ถ์ด ์์ต๋๋ค. ๊ทธ๋ค์ด ์ฌ์ฉํ๋ ๋๊ตฌ๋ฅผ ๋ถ์์ง ์๋ ๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค.
์๋ ์ค
์๋ ์ค, ๋น์ ์ด ์ค๋๋ ฅ์ด ์๋ ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ๋๋ค์ด Go์์ ์ด์ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ์์ผ๋ก ๋ ๊ฐ์ง ๊ฐ๋ฅํ ๊ฒฝ๋ก๊ฐ ํ์๋ฉ๋๋ค.
Open
๋ํ ์๋ก์ด ์ตํธ์ธ ํ๋๊ทธ๋ Windows์ ๊ฒฝ์ฐ FILE_SHARE_DELETE
๋ฅผ ์๋ฏธํ๊ณ ๋ค๋ฅธ OS์์๋ ๋ฌด์๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ POSIX ์๋ฏธ ์ฒด๊ณ๋ฅผ ๊ธฐ๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ชจ๋ ์ฌ๋์ด ์ด ํ๋๊ทธ๋ฅผ ๋ชจ๋ ๊ณณ์์ ์ ๋ฌํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๋๋,os.Open
์ฒ๋ผ ์๋ํ๋ Open
๋ผ๋ ํ๋์ ํจ์๊ฐ ์๋ ์๋ก์ด Go ํจํค์ง posix
(์ด๋๊ฐ์ ์ผ๋ถ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์์). Windows๊ฐ ์๋ ํ๋ซํผ์์๋ os.Open
์ง์ ํธ์ถํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ๋ค์ ์ฌ์ฉํ๋ POSIX ์๋ฏธ๋ฅผ ๊ธฐ๋ํ๋ ์ฌ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค ๊ฒ์
๋๋ค posix.Open
๋์ os.Open
์ฌ๋ฐฉ.์ด ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์ ๋ชจ๋ Linux ๊ฐ๋ฐ์๋ Windows์์ POSIX ๋์์ ์ ์งํ๊ธฐ ์ํด ์ถ๊ฐ ์กฐ์น๋ฅผ ์ทจํด์ผ ํ์ง๋ง, ์ ์ด๋ ์ด๊ฒ์ ์ผํ์ฑ CreateFile ๋ํผ๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋ซ์ต๋๋ค.
์๋ ์ค, ๋น์ ์ด ์ค๋๋ ฅ์ด ์๋ ๊ฒ์ด ๋ถ๋ช ํฉ๋๋ค.
๋๋ ์ค๋๋์ง ์๋๋ค. ํ์ง๋ง ๋๋ฅผ ์ค๋ํ ํ์๋ ์๊ณ , ๋ฐ๋ํ์ ์ค๋ํด์ผ ํ๋ค. ๊ทธ๋ค์ ๊ฒฐ์ ์ ๋ด๋ฆด ๊ฒ์ ๋๋ค.
Open
๋ํ ์๋ก์ด ์ตํธ์ธ ํ๋๊ทธ๋ Windows์ ๊ฒฝ์ฐFILE_SHARE_DELETE
๋ฅผ ์๋ฏธํ๊ณ ๋ค๋ฅธ OS์์๋ ๋ฌด์๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ POSIX ์๋ฏธ ์ฒด๊ณ๋ฅผ ๊ธฐ๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ชจ๋ ์ฌ๋์ด ์ด ํ๋๊ทธ๋ฅผ ๋ชจ๋ ๊ณณ์์ ์ ๋ฌํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๋๋,
์ด ์ต์ ๋ ๋ง์์ ๋ค์ง ์์ต๋๋ค.
๋จผ์ os ํจํค์ง๋ ๋ชจ๋ OS์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ํน์ OS๋ syscall, golang.org/x/sys/windows, ๋๋ ์ฐ๋ฆฌ๊ฐ ์ข์ํ๋ ๋ค๋ฅธ ํจํค์ง๋ก ์ด๋ํด์ผ ํฉ๋๋ค.
๋์งธ, ๋ด๊ฐ ์ํ์ง ์๋๋ผ๋ ๋ด ํ๋ก๊ทธ๋จ์์ FILE_SHARE_DELETE
ํ์ผ ํ์์ผ๋ก ๋๋ ๊น๋ด ๊ฑฑ์ ๋ฉ๋๋ค. FILE_SHARE_DELETE
ํ์ผ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ธ๋ถ ํจํค์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ๋ฅผ ์์ํด ๋ณด์ญ์์ค. ๋ด ์ฝ๋ ์ค ์ผ๋ถ๊ฐ FILE_SHARE_DELETE
์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ํจํค์ง ์์ค ์ฝ๋๋ฅผ grepํด์ผํฉ๋๋ค. ๋๋ ํจํค์ง ๋ฌธ์๋ ์ฌ์ฉ์์๊ฒ ๊ฒฝ๊ณ ํด์ผ ํฉ๋๋ค. ์ผ๋ถ ํจํค์ง ์์ฑ์๊ฐ FILE_SHARE_DELETE
์ ํจ๊ป syscall.CreateFile์ ์ง์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง FILE_SHARE_DELETE
๊ฐ os ํจํค์ง์ ์ถ๋ณต์ด ๋๋ค๋ฉด ์ด๊ฒ ๋ ์ผ๋ฐ์ ์ผ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. Windows์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ Linux ์ฌ์ฉ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ Linux ํ๋ก๊ทธ๋จ์ Windows๋ก "๋ ์ฝ๊ฒ" ํฌํธํ ์ ์์ ๊ฒ์
๋๋ค.
์
์งธ, FILE_SHARE_DELETE
ํ๋๊ทธ๋ฅผ ๋ฌธ์ํํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ POSIX๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ํ๋๊ทธ๊ฐ ํ๋ ์ผ์ ์ค๋ช
ํด์ผ ํฉ๋๋ค. ๊ฐ๋จํ ๋จ์ด๋ก. ๋ํ ๊ธฐ์ตํ์ญ์์ค:
์ค์ ๋ก Unix์ ์๋ฏธ๊ฐ ์์ ํ ๊ฐ์ง๋ ์์ต๋๋ค.
ํ์ผ์ ์ญ์ ํ ํ์๋ ํธ๋ค์ด ๋ซํ ๋๊น์ง ๋์ผํ ์ด๋ฆ์ ํ์ผ์ ์์ฑํ๊ฑฐ๋ ํ์ผ์ด ํฌํจ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ์ผ์ ์ญ์ ํ๊ธฐ ์ ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ๊ฐ์ ๋ค๋ฅธ ์์น๋ก ํ์ผ์ ์ด๋ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
https://github.com/golang/go/issues/32088#issuecomment -504321027์์. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ฌธ์ํํด์ผ ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ FILE_SHARE_DELETE
ํ๋๊ทธ๊ฐ ์ ๊ณตํ๋ ๋ค๋ฅธ ๋ชจ๋ ๊ธฐ๋ฅ.
๋ท์งธ, FILE_SHARE_DELETE
๋ํ ์๋ก์ด ํ
์คํธ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํ
์คํธ๋ ๋ฌด์์
๋๊น? ์ผ๋ถ ๊ธฐ๋ฅ์ ํ
์คํธํ๋ ๊ฒ์ ์์๋ค๊ฐ ๋์ค์ FILE_SHARE_DELETE
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ๋ฌ์ฑํ ์ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? FILE_SHARE_DELETE
ํ๋๊ทธ๊ฐ ๋ง์์ ๋ค์ง ์์ผ๋ฉด ์ ๊ฑฐํ ์ ์์ต๋๋ค. ํ ๋ฒ ๋ค์ด๊ฐ๋ฉด ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ฏธ๋์ ๊ทธ๊ฒ์ ์ง์ํด์ผ ํฉ๋๋ค.
2. CreateFile์ FILE_SHARE_DELETE๋ก ๋ํํ์ง๋ง ๊ทธ๋ ์ง ์์ผ๋ฉด
os.Open
๋ก ์๋ํ๋Open
ํจ์๊ฐ ์๋ ์๋ก์ด Go ํจํค์งposix
(์ด๋ ์ ์ฅ์์ ์์)
๊ทธ๊ฒ ์ด๋ป๊ฒ ๊ฐ๋ฅํ์ง ๋ชจ๋ฅด๊ฒ ๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋ฅํ๋ฉด ํจํค์ง๋ฅผ ์ง์ ๋ง๋ค ์ ์์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด github.com/jstarks/posix์ ๊ฐ์ต๋๋ค. ์๋? golang.org/x/sys/windows/posix ๋๋ ๊ธฐํ ํญ๋ชฉ์ ํจํค์ง๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง ํฐ ์ฐจ์ด๋ ์์ต๋๋ค.
์๋ ์ค
os ํจํค์ง๋ ๋ชจ๋ OS์์ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ผ ํฉ๋๋ค...
FILE_SHARE_DELETE ํ๋๊ทธ๋ฅผ ๋ฌธ์ํํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ POSIX๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค ...
FILE_SHARE_DELETE์ ๋ํ ์ ํ ์คํธ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํ ์คํธ๋ ๋ฌด์์ ๋๊น?
์ด ๋ชจ๋ ๊ฒ์ ์์์ ์ธ๊ธ๋์์ต๋๋ค.
FILE_SHARE_DELETE ํ์ผ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ธ๋ถ ํจํค์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ. ๋ด๊ฐ ์ด๋ป๊ฒ ์๊ฒ ์ด
๊ทธ๊ฒ์ ๊ทธ๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ง๋ค๊ณ ๊ทธ๊ฒ์ ๋นํ์ฑํํ๊ธฐ ์ํ ์ ์ญ ํ๋๊ทธ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ๋ ๋ค๋ฅธ ์ธ์์ ๋๋ค.
์ํฅ์ ๋ฐ๋ Windows ์ฑ์ ์ฐพ๊ธฐ ์ํด golang-nuts์ ๊ฒ์ํ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ณ์ ๋ณผ ์ ์๋๋ก ๋ฉฐ์น ์ ํ ๋ฒ์ฉ ํ์ ํ ๊ฒ์ด๋ค. ๊ทธ๊ฒ์ด ๋ง์ด ๋๋ฌ๋์ง ์๋๋ค๋ฉด 1.14์ ๊ธฐ๋ณธ ํ์ผ๋ก ์ค์ ํ๋ฉด ์ํฉ์ด ๋ช
ํํด์ง ๊ฒ์
๋๋ค.
https://groups.google.com/d/topic/golang-nuts/8BiP_mPoCd4/discussion
๊ทธ๊ฒ์ ๊ทธ๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ง๋ค๊ณ ๊ทธ๊ฒ์ ๋นํ์ฑํํ๊ธฐ ์ํ ์ ์ญ ํ๋๊ทธ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ๋ ๋ค๋ฅธ ์ธ์์ ๋๋ค.
ใ ์ด ํ๋๊ทธ๋ Linux์์ ๋ฌด์์ ํด์ผ ํฉ๋๊น? ์ฐ๋ฆฌ๋ ์ค์ ๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ์ญ์ ํ ์ ์๋ ๋ฐฉ์์ผ๋ก Linux์์ ํ์ผ์ ์ฌ๋ ๊ธฐ๋ฅ์ ๋์น๊ณ ์์ต๋๊น? https://gavv.github.io/articles/file-locks/#open -file-description-locks-fcntl ๊ธฐ๋ฐ์ผ๋ก ์ต์ ๋ฒ์ ์ Linux์์ ๊ตฌํํ ์ ์์ด์ผ ํฉ๋๋ค.
ํ๋๊ทธ(์: var OpenWithout_FILE_SHARE_DELETE = false
)๋ syscall.Open()์ ๋์์ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก syscall_windows.go์ ์ ์๋ฉ๋๋ค.
Linux ์ ์ฉ ํ๋๊ทธ๋ ๋ค๋ฅธ ์ด๋ฆ์ ๊ฐ์ง๋ฉฐ syscall_linux.go์ ์ ์๋ฉ๋๋ค. ๋๋ ๋๋ ํ ๋ฆฌ์ ๋ํ ๊ถํ์ ํตํ์ง ์๊ณ Linux์์ ์ด๋ฆฐ ํ์ผ์ ์ญ์ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค. ์ ๊ณตํ ๋งํฌ๋ "๊ถ๊ณ " ์ ๊ธ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
@jstarks FILE_SHARE_DELETE
ํ๋๊ทธ ๋์
์ ๊ณ ๋ คํ๊ธฐ ์ ์ Go์์ ์คํ ์ค์ธ ์คํ ํ์ผ์ ์ญ์ ํ ์ ์๋ ๋ฌธ์ ์ ๋ํด์๋ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. FILE_SHARE_DELETE
ํ๋๊ทธ๊ฐ ์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๋ฅผ ๋์ธ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํ ์ ์์ต๋๊น? ์์ง ์คํ ์ค์ธ ์คํ ํ์ผ์ ์ญ์ ๋ฅผ ๊ตฌํํ ์ ์๋ค๋ฉด POSIX ํธํ์ฑ์ ์ฃผ์ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ FILE_SHARE_DELETE
ํ๋๊ทธ๋ ๋ฐ์ชฝ
๋๊ตฐ๋ค๋ ๊ฐํน ์๋ฃ๋ ํ๋ก์ธ์ค์ ์คํ ํ์ผ์ ์ญ์ ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์๋ฅผ ๋ค์ด #25965, #19491 ๋ฐ #32188์ ์ฐธ์กฐํ์ญ์์ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํธ๋ฅผ ๋ณด๋ผ ๋๊น์ง ํ๋ก์ธ์ค ํธ๋ค์์ WaitForSingleObject๋ฅผ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฌ๋ ์คํ ํ์ผ์ด ์ญ์ ๋ ์ ์๋ค๋ ๋ณด์ฅ์ ์์ต๋๋ค. ํ์ผ ์ญ์ ๋ฅผ ์๋ํ๊ธฐ ์ ์ 5๋ฐ๋ฆฌ์ด์ ๋๊ธฐ ์๊ฐ์ ์ถ๊ฐํด์ผ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ํญ์ ์๋ํ๋ ๊ฒ์ ์๋๋๋ค - https://github.com/golang/go/issues/25965#issuecomment -482037476
๋ํ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ง๋ง ๊ด์ฌ์ ๊ฐ์ ธ์ฃผ์๋ฉด windows-arm ํฌํธ๋ฅผ ๋์ด๋ฆฌ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ #32135๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๊ธฐ๋ณธ์ ์ผ๋ก @jordanrh1์ Go๋ฅผ windows-arm์ผ๋ก ์ด์ํ์ง๋ง ๋ ์ด์ windows-arm ๋น๋๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํฌํธ๊ฐ ์ฌ์ ํ ์๋ ์ค์ธ์ง ๊ณ ์ฅ ๋ฌ๋์ง์กฐ์ฐจ ๋ชจ๋ฆ ๋๋ค. ๋น๋๋ฅผ ์คํํ๋ ๋ฐ ๋์์ ์ค ์ ์๋ค๋ฉด Windows-am ํฌํธ๋ฅผ ๊ณ์ ์ง์ํ๋ ค๊ณ ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํฌํธ๊ฐ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค. - https://github.com/golang/go/wiki/PortingPolicy ๋๊ตฐ๊ฐ๊ฐ Windows 10 Iot์์ Go ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋ฐ ๊ด์ฌ์ด ์๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด๋ฏธ ์ด ์ง์์ ๋ฐ๊ณ ์์ต๋๋ค. ์์ ํ๋ ๋น๋๊ฐ ์๋ค๋ ์ด์ ๋ก ๋์จํด์ง๋ฉด ์ฌํ ๊ฒ์ ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
์์ ์คํ ํ์ผ ์ญ์ ๋ฅผ ์ํ ์ ์๋ ์๋ฃจ์ : https://github.com/golang/go/issues/25965#issuecomment -495636291
golang-nuts ๊ฒ์๋ฌผ์ ๊ฒฐ๊ณผ๊ฐ ์์ต๋๋ค. ์ ์ค๋ ๋๋ฅผ ์์ํ์ต๋๋ค.
https://groups.google.com/d/topic/golang-nuts/aRvSo3iKvJY/discussion
๋ด๊ฐ ์กฐ์ฌํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ ์ต์ํ ํ๋์ ๊ฐ์ค์ ์ด์ง ์์ ๋ฌธ์ ๋ ํ์ผ ์ ๊ธ ๋ฐ ์ด์ ์์กดํ๋ ํ๋ก๊ทธ๋จ์ ๋ํ ์ํฅ์ผ ๊ฒ์ ๋๋ค.
FILE_SHARE_DELETE
๋ชจ๋ ํ์ผ ํธ๋ค์ ์ฌ๋ ๊ฒ์ FILE_SHARE_DELETE
์ง์ ๋ ํ์ผ์ด ์ ๊ฑฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ LockFileEx
์ ์๋ฏธ๋ฅผ POSIX ๊ถ๊ณ ์ ๊ธ์ ์๋ฏธ๋ก ํจ๊ณผ์ ์ผ๋ก ์ฝํ์ํต๋๋ค. ์ ๊ธ์ด ํด์ ๋ ๊ฒฝ์ฐ์๋ ํด๋น ํ์ผ์ ์์ญ์ ๋ณด๊ด๋ฉ๋๋ค. 1
๋ฌผ๋ก ์ด๊ฒ์ os.File.Fd
์์ ๋ฐํ๋ ์ค๋ช
์๋ก ์ด๋ฃจ์ด์ง LockFileEx
ํธ์ถ์๋ง ์ ์ฉ๋์ง๋ง ๊ฐ์ฅ ์ธ๊ธฐ ์๋ Go ํ์ผ ์ ๊ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (ํ์ฌ Docker ํฌํจํ์ฌ 33๊ฐ์ ์๋ ค์ง ๊ฐ์ ธ์ค๊ธฐ ๊ฐ ์์) ์์ ์ํ ๋ . , gVisor ๋ฐ Kubernetes). ์ด๋ Terraform ์์๋ ์ํ๋๋ฉฐ LockFileEx
๋ ๋ค๋ฅธ Go ์ฝ๋ ๋ก๋์ ์ฌ์ฉ๋ฉ๋๋ค.
๋๋ ์ฌ์ ํ ์ด ๋ณํ๊ฐ ์ต์ ์ ๊ฒฝ์ฐ(์ต์ ์ ๊ฒฝ์ฐ CVE-factory)์์ ๋ฌด๋ถ๋ณํ ์๋์ฒ๋ผ ๋ณด์ธ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋ถํ์คํ ์ด์ ์ด ๋ฐ์ํ ๋ช ํํ ์ฝ๋ ์์๋ณด๋ค ์ผ๋ง๋ ์ค์ํ์ง ์ ๋ง๋ก ์์ง ๋ชปํฉ๋๋ค.
๋๋ ๋ํ ๋๋ถ๋ถ์ golang-nuts ์ฌ์ฉ์๊ฐ ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฏธ๋ฅผ ์์ ํ ์ดํดํ์ง ๋ชปํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. Go ํ์ ํ๊ฐ๊ฐ ์์ผ๋ฉด golang-dev์ ๋ํ ๊ฒ์๋ฌผ์ด ํ ๋ก ์ ์์ฑํ๋ ๋ฐ ๋ ํจ๊ณผ์ ์ผ ์ ์์ต๋๋ค(ํนํ ์ด๊ฒ์ด ํต์ฌ ๋ณ๊ฒฝ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์). ์ฌ์ค, ๊ทธ๊ฒ์ ๊ธฐ์ ์ ์ผ๋ก ์ด๋ ํด์ฒด์ธ์ ์ํฅ์ ๋ํ ์ฌ์ฉ LockFileEx
์๊ธฐ ๋ฐฉ์์ .
1 ์, ์ผ๋ถ Windows ์ ๊ธ ์ ์ฉ์ด ์ฌ์ ํ POSIX๋ณด๋ค ๋ ๊ฐ๋ ฅํ๋ค๋ ๊ฒ์ ์๋๋ค. ๊ทธ๋ฌ๋ ํ์ผ์ ํต์ผ๋ก ๋ง๋ค ์ ์๋ค๋ฉด ๋ฆฌ์์ค ์์ฝ์ ์ํด ์ ๊ธ ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋ฌธ์ ๋ฅผ ์ด์์ ๋ golang-dev์ ๊ฒ์ํ์ต๋๋ค.
https://groups.google.com/d/topic/golang-dev/R79TJAzsBfM/discussion
๋์ดํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค GOOS=windows ๋์์ _์์กด_ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๊น? ๋น์ ์ ์ด ๋ณ๊ฒฝ์ด ๊ธฐ์กด ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ด๋ผ๊ณ ๋ฐ๋ณตํด์ ์ฃผ์ฅํ์ง๋ง ์ด๋ ํ ์ฆ๊ฑฐ๋ ์ ๊ณตํ์ง ์์์ต๋๋ค.
์ง์งํ ์ ์๋ ์ ์ ์ ์ธ ๋ฐ์ธ์ ์์ ํด ์ฃผ์ญ์์ค. ๊ทธ๊ฒ์ ์๋ฌด ๊ฒ๋ ์ค๋ช ํ์ง ์์ผ๋ฉฐ ๋๋ ๊ทธ๊ฒ์ด ๋ถ์พํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌธ์ ๋ฅผ ์ด์์ ๋ golang-dev์ ๊ฒ์ํ์ต๋๋ค. https://groups.google.com/d/topic/golang-dev/R79TJAzsBfM/discussion
๊ฑฐ๊ธฐ์ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ๊ฐ์์ ์ด์ ๋ก ์์ด๋์ด๋ฅผ ํฌ๊ธฐํ ๊ฒ ๊ฐ์ง๋ง(์ด ์ค๋ ๋์์ ์ด์ ์ ์ธ๊ธํ ๊ฒ๊ณผ ๋น์ทํจ) ์์ด๋์ด๊ฐ ์ด์ Go 1.14์์ ์ด ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๊ธฐ ์ํด ๋ ๋์๋ค๋๊ณ ์๋ค๋ฉด ๊ทธ์ ๋ํ ํ์ ์กฐ์น์ ๋๋ค. ์ค๋ ๋๊ฐ ์ ์ฉํ ์ ์์ต๋๋ค(์ด ํ ๋ก ์ ๋ํ ๋ฏธ๋ฆฌ ์๋ฆผ ๋งํฌ ํฌํจ).
๋์ดํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค GOOS=windows ๋์์ ์์กด ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๊น? ๋น์ ์ ์ด ๋ณ๊ฒฝ์ด ๊ธฐ์กด ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ด๋ผ๊ณ ๋ฐ๋ณตํด์ ์ฃผ์ฅํ์ง๋ง ์ด๋ ํ ์ฆ๊ฑฐ๋ ์ ๊ณตํ์ง ์์์ต๋๋ค.
ํ์คํ ๋งํ๋ ค๋ฉด ( ๋ง์ ์ฝ๋์ ๋ํ) ์์ ํ ๋ณด์ ํ๊ฐ๊ฐ ํ์ํฉ๋๋ค. ๋๋ ์ฌ๋๋ค์ด ์ด ํ๋๊ทธ์ ๋์ ์ผ๋ก ๋์ ๋๊ฒ ๋ฐ๋ ํ๋์ ์์กดํ๊ณ ์๋ค๋ ์ถฉ๋ถํ ์ฆ๊ฑฐ๋ฅผ ํ์คํ ์ ๊ณตํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ GitHub์์ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋์ผ ๋ฟ์ ๋๋ค.
์ง์งํ ์ ์๋ ์ ์ ์ ์ธ ๋ฐ์ธ์ ์์ ํด ์ฃผ์ญ์์ค. ๊ทธ๊ฒ์ ์๋ฌด ๊ฒ๋ ์ค๋ช ํ์ง ์์ผ๋ฉฐ ๋๋ ๊ทธ๊ฒ์ด ๋ถ์พํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋งํฌ์ ์ฝ๋๊ฐ ์ถฉ๋ถํ ์ง์๋์ง ์์ผ๋ฉด ๊ทํ์ ์ฑ ์ ๋ฌด์์ด ํฌํจ๋ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ปดํ์ผ์ด ์ค์ง๋๋ ์ฝ๋๋ฅผ ์ฐพ์ง๋ ์๊ฒ ์ง๋ง, ํ์คํ ๋ค๋ฅด๊ฒ ๋์ํ๋ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์์ผ๋ฉฐ ๋ง์ ์ฌ๋๋ค์ ์ด๋ฌํ ๋์ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ํด๋น ์ฝ๋๊ฐ "๊นจ์ง" ๊ฒ์ผ๋ก ๊ฐ์ฃผํ ๊ฒ์ ๋๋ค.
๋ด ๋ฐ๋๋ฅผ ๊ฐ์ธ์ ์ผ๋ก ๋ฐ์๋ค์ด์ง ๋ง์ญ์์ค. ์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋(๋น์ ์ ํฌํจํ์ฌ)์ด ์ธ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์๊ฒฌ์ ์ถ๊ฐํ๋ ค๊ณ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํต์ฌ ๋ณํ๋ฅผ ์นํธํ๋ ค๋ฉด ๊ฑด๊ฐํ ์ ํญ์ ๊ธฐ๋ํด์ผ ํฉ๋๋ค.
์์์ ์ค๋ช ํ๋ฏ์ด FILE_SHARE_DELETE๋ก ํ์ผ์ ์ญ์ ํ๋ ๊ฒ์ UNIX์ ๊ฐ์ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด ๋จ๊ณ๋ฅผ ์๋ํ์ญ์์ค.
๋ฉ์ธ.c
#include <windows.h>
#include <stdio.h>
int
main() {
// ensure delete the file
DeleteFile("test.txt");
// create test.txt with FILE_SHARE_DELETE
HANDLE h = CreateFile("test.txt",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
puts("waiting 10sec, please run watch.exe on another cmd.exe");
Sleep(10000);
if (DeleteFile("test.txt")) {
puts("deleted");
}
getchar();
return 0;
}
watch.c
#include <stdio.h>
#include <shlwapi.h>
int
main() {
// waiting test.txt will be removed.
while (PathFileExists("test.txt")) {
puts("watching...");
Sleep(1000);
}
// now test.txt should not exists. So this is possible to create new file
system("notepad test.txt");
return 0;
}
๋ฉ์ดํฌํ์ผ
all : main.exe watch.exe
watch.exe : watch.c
gcc -o watch.exe watch.c -lshlwapi
main.exe : main.c
gcc -o main.exe main.c
๋จผ์ main.exe๋ฅผ ์คํํ๊ณ ๋ค์์ผ๋ก watch.exe๋ฅผ ์คํํ์ญ์์ค. UNIX์์ unlink(2)๋ ์ฆ์ ํ์ผ์ ์ ๊ฑฐํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ผ์ด ์กด์ฌํ๋ ๊ฒ์ ๊ฐ์ํ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ํ์ผ ์ด๋ฆ์ผ๋ก ์ ํ์ผ์ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Windows์์ notepad.exe๋ Windows๊ฐ ํ์ผ์ ์ฆ์ ์ญ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ "์ก์ธ์ค ์๋ฐ"์ด๋ผ๋ ์ค๋ฅ ๋ํ ์์๋ฅผ ํ์ํฉ๋๋ค. ๋๋ ๋น์ ์๊ฒ ์ด๊ฒ์ผ๋ก ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ์ง ๋งํ ์ ์์ต๋๋ค. ๋ณด์ ๋ฌธ์ ? ์ค์ํ ํ์ผ์ ๋ถ์คํ์ จ์ต๋๊น? ์ฃ์กํฉ๋๋ค. ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@havoc-io Windows๋ ํ์ผ์ด ๋ซํ ๋๊น์ง ์ด๋ฆฐ ํ์ผ์ ์ญ์ ํ์ง ์์ผ๋ฉฐ ์ด๋ฆฐ ํ์ผ์ ๋ํ ์ ๊ธ๋ง ์ ์งํฉ๋๋ค. ๋ฐ๋ผ์ ์ ๊ธ ์ฌ์ฉ์ os.Remove() ์คํจ์ ๋ํ ์์กด์ฑ์ ์๋ฏธํ์ง ์์ต๋๋ค. Pls๋ ํนํ ํด๋น ์คํจ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ค์ ์ฃผ์ golang-dev ์ค๋ ๋์ ping์ ๋ณด๋ด๊ฒ ์ต๋๋ค. 2๋ช ์ ppl์ด ๊ทธ๊ฒ์ ์๋ตํ์ต๋๋ค; ํ ์ฌ๋์ ์ด ๋ฌธ์ ๋ฅผ ์ฝ์ง ์์์ผ๋ฉฐ ์ด๋ ์ชฝ๋ ์๋ฅผ ์ ๊ณตํ์ง ์์์ต๋๋ค.
์ ์ ์ ์ด๊ณ ์ง์งํ ์ ์๋ ์ฃผ์ฅ์ "๊ฑด์ ํ ์ ํญ"์ด ์๋๋๋ค.
@havoc-io Windows๋ ํ์ผ์ด ๋ซํ ๋๊น์ง ์ด๋ฆฐ ํ์ผ์ ์ญ์ ํ์ง ์์ผ๋ฉฐ ์ด๋ฆฐ ํ์ผ์ ๋ํ ์ ๊ธ๋ง ์ ์งํฉ๋๋ค. ๋ฐ๋ผ์ ์ ๊ธ ์ฌ์ฉ์ os.Remove() ์คํจ์ ๋ํ ์์กด์ฑ์ ์๋ฏธํ์ง ์์ต๋๋ค. Pls๋ ํนํ ํด๋น ์คํจ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
@networkimprov ๋ ๊ฐ์ง ๋ค๋ฅธ ์ ํ์ ์ ๊ธ์
์ ๊ธ ํ์ผ( LockFileEx
๋ก ์ ๊ฒจ ์์)์ ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ๋ณดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ ๊ฐ์ง ์๋ ์คํ ์ค์ธ ๋ฐ๋ชฌ์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ์๋์ง ํ์ธํ๋ ๊ฒ์
๋๋ค. Windows Go ๋ฐ๋ชฌ์ด ํ์ผ์ ์ฐ ๋ค์ ํ์ผ์์ LockFileEx
๋ฅผ ์คํํ๊ณ ๋ฐฐํ์ ์ ๊ธ์ ์ฑ๊ณต์ ์ผ๋ก ํ๋ํ๋ฉด ์ ๊ธ ํ์ผ์ด ๊ทธ ์๋์์ ์ ๊ฑฐ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์ ๋นํ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ FILE_SHARE_DELETE
๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ผ๋ฉด ์ด๋ฌํ ๊ฐ์ ์ ํ๋ ๋ชจ๋ ๊ธฐ์กด ์ฝ๋๊ฐ ๋ ์ด์ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ์ผ๋ถ ์ถ๊ฐ ์์ด์ ํธ๊ฐ ํด๋น ์ ๊ธ ํ์ผ์ ์ ๊ฑฐํด์ผ ํ๋ ๊ฒฝ์ฐ(์: ์ฌ์ฉ์๊ฐ ์ค์๋ก ๋๋ ํ ๋ฆฌ๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ) ์ ๋ฐ๋ชฌ์ด ์์ํ๊ธฐ๋ก ๊ฒฐ์ ํ ๋ ์๋ ๋ฐ๋ชฌ์ด ์ฌ์ ํ ์คํ ์ค์ผ ์ ์์ต๋๋ค.
LOCKFILE_FAIL_IMMEDIATELY
ํ๋๊ทธ๊ฐ ์๋ต๋์ด LockFileEx
๊ฐ ์ ๊ธ ํ๋์ ์ํด ์ฐจ๋ก๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ ๊ฒฝ์ฐ ์ ๊ธ ํ์ผ์ ํ์ดํ๋ผ์ธ ๋ช
๋ น์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ ๊ธ ํ์ผ์ด ์ค์๋ก ์ ๊ฑฐ๋๋ฉด ํ์ดํ๋ผ์ธ์ ์์ด์ผ ํ๋ ์ฌ๋ฌ ๋ช
๋ น์ด ํ ๋ฒ์ ์คํ๋ ์ ์์ต๋๋ค.
์ ์ ์ ์ด๊ณ ์ง์งํ ์ ์๋ ์ฃผ์ฅ์ "๊ฑด์ ํ ์ ํญ"์ด ์๋๋๋ค.
์๋ฌด๋ ์ด ์ค๋ ๋์์ ์ ์ ์ ์ด๊ฑฐ๋ ์ง์งํ ์ ์๋ ์ฃผ์ฅ์ ํ์ง ์์ต๋๋ค. ๋๋ฅผ ํฌํจํ์ฌ ๋น์ ์ ์ ์์ ๋์ํ์ง ์์ ๋ชจ๋ ์ฌ๋์ ์ฝ๋๊ฐ ๋ท๋ฐ์นจํ๋ ๊ฑด์ ํ ์ฃผ์ฅ์ ์ ๊ณตํ์ต๋๋ค. ๋น์ ์ ์ ์์ ์ง์ง ํ ์ฌ๋๋ค๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
Pls๋ WinAPI ๋ฌธ์๋ฅผ ๊ฒํ ํฉ๋๋ค. Windows๋ ํ์ผ์ด ๋ซํ ๋๊น์ง ์ด๋ฆฐ ํ์ผ์ ์ญ์ ํ์ง ์์ผ๋ฉฐ ์ด๋ฆฐ ํ์ผ์ ๋ํ LockFileEx() ์ ๊ธ๋ง ๋ณด์ ํ๋ฏ๋ก ์ญ์ ์ ๊ด๊ณ์์ด ํ์ผ์ด ๋ซํ ๋ ์ ๊ธ์ด ์ง์๋์ง ์์ต๋๋ค. ์ญ์ ํ ์ ๊ธด(์ฆ, ์ด๊ธฐ) ํ์ผ์ ์ด๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ํ์๋๋ฏ๋ก ๋ ๋ฒ์งธ ์ ๊ธ์ ํ๋ํ ์ ์์ต๋๋ค. ์ ๊ธ์ ๊ธฐ๋ค๋ฆฌ๋ ์ค๋ ๋์๋ ํ์ผ์ด ์ด๋ ค ์์ผ๋ฏ๋ก ์ญ์ ๋ก ์ธํด ์ค๋จ๋์ง ์์ต๋๋ค.
๋ฌธ์๋ฅผ ์๋ชป ์ฝ์ง ์๋ ํ ๋ง์ง๋ง ๋ ์๋๋ฆฌ์ค๋ ์ง์๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ ์ ์ ์ด์๊ณ ์ง์๋์ง ์์์ต๋๋ค. "์ด ๋ณ๊ฒฝ์ ์ต์ ์ ๊ฒฝ์ฐ์ ... CVE ๊ณต์ฅ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ ๋ ์ค์ ๋ก ๋ฐ์ํ๊ฒ ๋ ๋ช ํํ ์ฝ๋ ์์๋ณด๋ค ๋ชจํธํ ์ด์ ์ด ์ผ๋ง๋ ํฐ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค."
@networkimprov ๋ฌธ์ ๋ ๋ฆฌ์์ค ์ ํ ์ ๊ธ ํ์ผ์ด ์ผ๋ฐ์ ์ผ๋ก ํ์ผ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค๋ ๊ฒ์
๋๋ค. ๊ธฐ๋ณธ ํ์ผ ๊ฐ์ฒด๋ ํ์ผ์ด ๋ซํ ๋๊น์ง ์ญ์ ๋์ง ์์ ์ ์์ง๋ง DeleteFile
๋ฅผ ํตํด ์ ๊ฑฐ๋๋ฉด ํ์ผ ์์คํ
1 ์ ์ด์ ๊ฒฝ๋ก์์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ์ ๊ธ ํ์ผ์ ์์ฑํ ์ ์์ต๋๋ค. ํด๋น ๊ฒฝ๋ก์์ ์ ๊ธ ํ์ผ์ ๋ชฉ์ ์ ๋ฌดํจํํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ ์ ์ ์ธ ๋ ผํ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฝ๋๊ฐ ๋ ์ด์ ์ฌ์ค์ด ์๋ ํน์ OS ๋ถ๋ณ์ฑ์ ์์กดํ๋ ๊ฒฝ์ฐ ์ด์ ๊ฐ์ ๊ฒ์ด ๋ณด์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค๋ ๊ฒ์ ๊ฝค ๋ถ๋ช ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ด์ ์ ๊ฝค ๋ชจํธํด ๋ณด์ด๊ณ (์ฌ๋ฌ ์ฌ๋๋ค์ด ์ธ๊ธํ๋ฏ์ด: ์ด๊ฒ์ Windows ๋์์ POSIX์ ์ผ์น์ํค์ง ์์) ํ์์ ๊ฝค ๋ถ๋ช ํด ๋ณด์ ๋๋ค(์ ์ด๋ ํน์ ์ ๊ธ ๋์์ ๊นจ๋จ๋ฆผ).
1 ์ ์ด๋ ํ ์คํธํ ๋์ ์ด ์๊ฒฌ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒฝ์ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
https://github.com/golang/go/issues/ ์์ "์ต์ ๋ฒ์ ์ Windows์์๋ ํ์ผ์ด ๋ค์์คํ์ด์ค์์ ์ฆ์ ์ ๊ฑฐ๋๋ 'POSIX' ์ญ์ ๋ฅผ ์ํํ๋๋ก DeleteFile(NTFS)์ ์ ๋ฐ์ดํธํ์ต๋๋ค."
๋ค์ ํํ, ๋๋ ๋น์ ์ด ์ ์ฒด ์ค๋ ๋๋ฅผ ๊ฒํ ํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
AFAIK ํด๋น ๋ฒ์ ์ Windows๊ฐ ์ถ์๋์ง ์์์ต๋๋ค.
@networkimprov ์ด๋ฏธ Windows 10์ ๊ฒฝ์ฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ผ์ ์ด ๋ FILE_SHARE_DELETE
๋ฅผ CreateFileW
๋ก ์ง์ ํ๋ฉด LockFileEx
์ ๊ธด ํ์ผ์ ์ ๊ฑฐํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
DeleteFileW()๋ ํด๋น ์๋๋ฆฌ์ค์์ ์ค๋ฅ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. ํ์ผ ์์คํ ์์ ์ฆ์ ์ ๊ฑฐ๋์๋์ง, ํ์ผ/์ฑ ๋ซ๊ธฐ ์ ์ ๊ฑฐ๋์๋์ง ์ด๋ป๊ฒ ์ ์ ์์ต๋๊น? ํ์ผ์ ์ ๊ฑฐํ ํ ํ์ผ์ ์ด๊ฑฐ๋ ๋ค์ ๋ง๋ค๋ ค๊ณ ํ์ต๋๊น?
์ค์ ๋ก ์ด๋ ๊ธฐ์ ์ ์ผ๋ก Go ๋๊ตฌ ์ฒด์ธ์ ์ํฅ์ ๋ฏธ์น๋ฉฐ, _๋ํ_ ์์ ์ธ๊ธํ ๋ฐฉ์์ผ๋ก
LockFileEx
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
go
๋ช
๋ น ๋ด์์ ์ฐ๋ฆฌ๋ POSIX ์๋ฏธ ์ฒด๊ณ๋ฅผ ๋งค์ฐ ์ํ๋ฉฐ FILE_SHARE_DELETE
์ ๋ถ์ฌ์ ์ด๋ค ์์ผ๋ก๋ ์์กดํด์๋ ์ ๋ฉ๋๋ค. ์ฌ์ค, ๋๋ Windows ํ์ผ ์ ๊ธ์ด POSIX์์ ๋ฒ์ด๋๋ ๋ฐฉ์์ _ํด๊ฒฐํ๊ธฐ ์ํด ํน๋ณํ cmd/go/internal/robustio
ํจํค์ง๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
@ianlancetaylor ํ์ฌ (๋ฌธ์ํ๋์ง ์์) Windows syscall.Open() ๋์์ ์์กดํ๋ ๋ชจ๋ ํ๋ก์ ํธ์์ ์๊ฒฌ์ ๊ตฌํ๋ golang-nuts & -dev์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฒ์ํ์ต๋๋ค. ๋จ ํ ๊ฑด์ ์ฌ์ฉ ์ฌ๋ก๋ ๋ฑ์ฅํ์ง ์์์ต๋๋ค.
FILE_SHARE_DELETE๊ฐ ํ์ํ ์ฌ๋ฌ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ ๋ํ๋ฌ์ผ๋ฏ๋ก(Microsoft์์ ํน๋ณํ ์ฌ์ฉํ๋๋ก ์์ฒญํ๊ธฐ ๋๋ฌธ์) ์ํํ 1.14์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ณ ์ฃผ๊ธฐ ๋์ ์๋ ๋์ ํ๋ฉด์ ๋ํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋์ง ๋ค์ ํ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ด ์ค๋ ๋์ ์๋ถ๋ถ์์ ์ ์ํ ๊ฒ์ฒ๋ผ ์ด ํ๋๊ทธ ์์ด open() ํธ์ถ์ด ํ์ํ ์ฌ๋์ CreateFileW()
& os.NewFile()
์ฌ์ฉํ์ฌ ์์ ์ ํธ์ถ์ ์คํํ ์ ์์ต๋๋ค.
์ต์ํ ์ด๊ฒ์ ๋ํ ์์ก์ด๋ฅผ ๋ ธ์ถํ ์ ์์ต๋๊น?
์ด๊ฒ์ Windows์์ ๋ก๊ทธ ํ์ ์ ๊ตฌํํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ด๊ฒ์ Windows์์ ๋ก๊ทธ ํ์ ์ ๊ตฌํํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
ํ์คํ์ง๋ ์์ง๋ง ํ์ผ ํธ๋ค์ด ๋ซํ์ง ์์ผ๋ฉด FILE_SHARE_DELETE๊ฐ ์๋ ํ์ผ ์ด๋ฆ์ผ๋ก ์ ํ์ผ์ ์์ฑํ๋ ๊ฒ์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@Random-Liu Open()์์ fsd๋ฅผ ํ์ฑํํ๊ฑฐ๋ ๋นํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ๋ฌป๊ณ ์์ต๋๊น?
@mattn ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค. os.Rename
์ด์ ๋ก๊ทธ ํ์ผ ์ดํ์ ์๋ ์ด๋ฆ์ผ๋ก ์ ๋ก๊ทธ ํ์ผ์ ๋ง๋ค๊ณ ๋ฐ๋ชฌ์๊ฒ ๋ก๊ทธ ํ์ผ์ ๋ค์ ์ด๋๋ก ์๋ฆด ์ ์์ต๋๋ค.
@networkimprov FILE_SHARE_DELETE
ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ์ํฉ๋๋ค. ์ ๋ ํ์ฌ syscall.CreateFile
์ง์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ด Windows ๋ฒ์ :
Major Minor Build Revision
----- ----- ----- --------
10 0 17763 0
@Random-Liu ํ์ง๋ง UNIX ๋์์ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ฐ ์ด๊ฒ์ ์ฌ์ฉํ ์๋ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://github.com/golang/go/issues/32088#issuecomment -510345908
์ธ๋ถ ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ ํ์ผ ์ด๋ฆ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
mattn, ๊ทธ ์ ์ ๊ณ์ ๋ฐ๋ณตํ ํ์๊ฐ ์์ต๋๋ค. ํธ๋ค์ด ๋ซํ๊ธฐ ์ ์ ํ์ผ ์ด๋ฆ์ ์ฌ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ ๊ฒฝ์ฐ ํ์ผ์ ์ญ์ ํ๊ธฐ ์ ์ ํ์ผ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ผ ํ ํ์์ฑ(Windows์์)์ ๋ฌธ์ํํด์ผ ํ๋ค๊ณ ์ด๋ฏธ ์ธ๊ธํ์ต๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ ์์ฒด์์ ๋ซ๊ธฐ ์ ์ ํ์ผ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด logrotate๋ฅผ ํ๋ ค๋ ์ฌ์ฉ์์๊ฒ ์ฅ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ianlancetaylor ๋ค์ ์๋: https://github.com/golang/go/issues/32088#issuecomment -526074116
์ด ๋ฌธ์ ๋ฅผ ๋ฆด๋ฆฌ์ค ์ฐจ๋จ๊ธฐ๋ก ํ์ํ์ต๋๋ค.
@bcmills CL ๊ฒ์์ ๊ด์ฌ์ด
์ด ์ค: https://golang.org/src/syscall/syscall_windows.go#L291
ํ์ํ ๊ฒ: sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)
ํธ์ง: ํ์ผ์ ์์ฑํ ๋ค์ ํ์ผ์ ๋ซ๊ธฐ ์ ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ค๊ณ ์๋ํ๋์ง ํ์ธํ๋ ํ ์คํธ์ ๋๋ค.
๋ฌธ์ ๊ฐ ๋๊ฒฐ๋๊ธฐ ์ ์ ํ๋ฉดํํ ์๊ฐ์ด ์์ผ๋ฏ๋ก ๋นจ๋ฆฌ ํ์ํฉ๋๋ค...
๋ํ os.Remove() ๋ฌธ์๋ Windows์์ ํ์ผ์ด ๋ซํ๊ธฐ ์ ์ ํ์ผ ์ด๋ฆ์ ์ฌ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ ๊ฒฝ์ฐ ์ ๊ฑฐํ๊ธฐ ์ ์ ์ด๋ ค ์๋ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผ ํ๋ค๊ณ ์ธ๊ธํด์ผ ํฉ๋๋ค. Windows๋ ํ์ผ์ด ๋ซํ ๋๊น์ง ์ด๋ ค ์๋ ํ์ผ์ ๋ํ ์ญ์ ๋ฅผ ์๋ฃํ์ง ์์ต๋๋ค.
์ต์ ๋ฒ์ ์ Windows๊ฐ https://github.com/golang/go/issues/32088#issuecomment -502850674๋ฅผ ์ถฉ์กฑํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ธํ ๋ด์ฉ์ https://github.com/papertrail/go-tail/pull/10#issuecomment -529460973์ ์ฐธ์กฐ FILE_SHARE_DELETE
๊ณต์ ๋ชจ๋๋ก ์ด๋ฆฐ ๊ฒฝ์ฐ์
๋๋ค. ์ญ์ ํ๊ธฐ ์ ์ ์ด๋ฆ์ ๋ฐ๊ฟ ํ์๊ฐ ์์ต๋๋ค. Go์์ ๊ธฐ๋ณธ์ ์ผ๋ก FILE_SHARE_DELETE
๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ๋ง์นจ๋ด ์๋ฏธ๊ฐ ์์๊น์?
๊ทธ๊ฒ์ด ์๋์
๋๋ค. CL์ ์ ์ถํ ์ฌ๋๋ง ์์ผ๋ฉด ๋ฉ๋๋ค. (๊ทธ๋ ๊ฒ ํ๊ณ ์ถ์ง๋ง CLA์ ์๋ช
ํ ์ ์์ต๋๋ค.)
๋ด ์ด์ ๋ ์๊ฒฌ์ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ช
ํฉ๋๋ค ...
@jstarks @jordanrh1 @thaJeztah
์๋ฌธ:
์ผ๊ด๋ ํ๋์ ์ป์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?
ํ๋ก๊ทธ๋จ์ด "์ต์ Windows"์์ ์คํ๋๋ ๊ฒฝ์ฐ "์ญ์ ๋ณด๋ฅ" ํ์ผ๊ณผ ์ ์ฌํ ์ด๋ฆ์ ๊ฐ์ง ํ์ผ์ ์์ฑํ ์ ์์ผ๋ฉฐ ์ด์ ๋ฒ์ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋จ๋ฉ๋๋ค.
์ด๊ฒ์ ์ค์ ๋ก "ํ
์คํธ / ํ์ง ๋ณด์ฆ์ ํต๊ณผํ์ง๋ง ๋๋ถ๋ถ์ ๋์์์ ์๋ํ์ง ์์ต๋๋ค"๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค.
"๋ณดํต ์๋ํ์ง๋ง ์ธ์ ๊ฐ๋ ์๋ํ์ง ์์ต๋๋ค"(์ง๊ธ๋ถํฐ 2๋
ํ์ "ํ์ผ์ด ์ด๋ฏธ ์ข
๋ฃ๋จ" ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฐ๋ฐ์๋ ์ฌํํ ์ ์์).
์ฐ๋ฆฌ๋ '์ด์ ' ๋ฒ์ ์ ์๋ณํ๋ ๋ฐฉ๋ฒ์ ์์๋ด๊ณ ํด๋น ๋ฒ์ ์ ๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ๊ฑฐ๋ "๋๊ธฐ ์ค์ธ ์ญ์ ๊ฐ ์๋ ๊ฒฝ์ฐ" ์ค๋ฅ๋ฅผ ๊ฐ์ ํด์ผ ํฉ๋๋ค. ์ด๋ป๊ฒ ํ ์ ์์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ค๋ฉด ๋ถ์ผ์น๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น?
@guybrand ๋ ์์์ ์ธ๊ธํ๋ฏ์ด Windows์์ "ํ์ผ์ ๋ซ๊ธฐ ์ ์ ํ์ผ ์ด๋ฆ์ ๋ค์ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ ๊ฒฝ์ฐ ์ ๊ฑฐํ๊ธฐ ์ ์ ์ด๋ ค ์๋ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผ ํฉ๋๋ค."๋ผ๊ณ ๋ฌธ์ํํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ POSIX๋ฟ๋ง โโ์๋๋ผ ์ด์ ๋ฐ ์ Windows ๋ฒ์ ์์ ์๋ํฉ๋๋ค.
๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. "์ Windows ๋๋ POSIX์์๋ ์ฌ์ฌ์ฉํ๊ธฐ ์ ์ ํญ์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ"
๋๋ ๊ทธ๊ฒ์ ์ข์ํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ชจ๋ ๊ณณ์์ ์ฑ๊ณตํ ์ผ๋ฐ์ ์ธ ๊ดํ์ ์ง์งํฉ๋๋ค.
https://golang.org/cl/194957 ์์ ์ด ๋ฌธ์ ๋ฅผ ์ธ๊ธ ๋ณ๊ฒฝ: syscall: allow FILE_SHARE_DELETE on syscall.Open on Windows
golang-nuts
์ค๋ ๋๊ฐ ์ฌ๊ธฐ ์ ์์ผ๋ฉฐ ์๋ต์ด ์์ต๋๋ค. ์ด๊ฒ์ golang-nuts
๋ฅผ ์ฝ๊ณ ์ด ํ๋์ ๋ํด ์๋ ์ฌ๋์ด ์๋ฌด๋ ๊ทธ๊ฒ์ ์์กดํ์ง ์๋๋ค๋ ๊ฒ์ ๋ํ๋ด๋ ๊ฒ ๊ฐ์ต๋๋ค.
golang-dev
์ฐ๋ ๋๋ here and here ์ด๊ณ ํ์(์ต๊ทผ ์ฐ๋ ๋)๋ ์ด์๋ฅผ ์ ๊ธฐํ์ง ์์์ต๋๋ค.
@alexbrainman -2๋ ๋ช
๋ฐฑํ ๊ฒฐ์ ๋ถ์กฑ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋๋ก CL์ NeedsDecision
๋ก ๋ค์ ์ง์ ํ์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ด ์ค๋ ๋์ Microsoft ์ฌ๋๋ค์ด FILE_SHARE_DELETE
(https://github.com/golang/go/issues/32088 #issuecomment-502850674), ๊ทธ๋ฆฌ๊ณ golang-nuts
์๋ฌด๋ ์ ๊ฒฝ ์ฐ์ง ์๋ ๊ฒ ๊ฐ์ผ๋ ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ์ค๋ ๋์์ ๋ด๊ฐ ๋ณธ ๋ฐ๋ ์๊ฒฌ์ ๋ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๋ถ๋ฅ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
@alexbrainman (https://github.com/golang/go/issues/32088#issuecomment-504321027)๊ณผ @mattn (https://github.com/golang/go/issues/32088#issuecomment-494417146)์ ์ฐ๋ ค ๋์์ด ์ฌ์ ํ POSIX์ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ POSIX ์๋ฏธ ์ฒด๊ณ๋ฅผ ๊ธฐ๋ํ๋ ์ฌ์ฉ์๊ฐ ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค. (ํ์ง๋ง ์ด๋ฏธ Windows์ Open
๊ฐ POSIX ์๋ฏธ ์ฒด๊ณ๋ฅผ ์ ๊ณตํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ๊ทธ ์ฐ๋ ค๋ ์ ์๋ ๋ณ๊ฒฝ๊ณผ ๋ฌด๊ดํ๊ฒ ๋ณด์
๋๋ค.)
@havoc-io์ ์ฐ๋ ค(https://github.com/golang/go/issues/32088#issuecomment-510314947)๋ FILE_SHARE_DELETE
๊ฐ Windows์์ ์คํํ ๋ ํ์ผ ์ ๊ธ ํจํค์ง๊ฐ ์ ๊ณตํ๋ ๋ถ๋ณ์ฑ์ ๊ฐ์์ํค๋ ๊ฒ ๊ฐ์ต๋๋ค. . ๊ทธ๋ฌ๋ ๊ทธ ์ฃผ์ฅ์ ๋์๊ฒ ์ฝ๊ฐ ํผ๋์ค๋ฌ์ ๋ณด์
๋๋ค. ์๋ํ๋ฉด ์์๋ก ๋ค์ด ์๋ ๊ตฌ์ฒด์ ์ธ ํจํค์ง( github.com/gofrs/flock
)๋ "์ ๊ธ ๋์์ด ๊ฐ ํ๋ซํผ์์ ๋์ผํ๋ค๊ณ ๋ณด์ฅ๋์ง ์๋๋ค"๊ณ ๋ช
์์ ์ผ๋ก ์ธ๊ธํ๊ณ ๋น ๋ฅธ ๊ฐ์ฌ์์ ๊ตฌ์ฒด์ ์ธ ์ ์ค ์ด๋ ๊ฒ๋ ์ ๊ธ๊ณผ ํ์ผ ์ญ์ ์ฌ์ด์ Windows ๊ด๋ จ ์ํธ ์์ฉ์ ์์กดํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
https://github.com/golang/go/issues/32088#issuecomment -498690757์ ๋๊ธ์ ์ ๋ฅผ ํฅ๋ฏธ๋กญ๊ฒ ๋ง๋ญ๋๋ค.
https://codereview.appspot.com/8203043/ ์์ ์ ์ํ ๊ฒ์ฒ๋ผ ์ ์ฒด ๋๊ตฌ ์ฒด์ธ ๋์์ ๋ณ๊ฒฝํ๋ @ianlancetaylor ๋ ์ข์ ์๊ฐ์ด ์๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ํ์ผ ํธ๋ค์ ์ ๊ธ ํ์ผ๋ก ์ฌ์ฉํ ๋ ์ด ์ ์์ ์ผ๋์ ๋๋ ์ฆ๊ฐ์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋์์ ์ฌ์ฉํฉ๋๋ค.
@maruel , ๊ทํ์ ํ๋ก๊ทธ๋จ์ด ํ์ผ ์ ๊ธ๊ณผ ํ์ผ ์ญ์ ๋๋ ์ด๋ฆ ๋ณ๊ฒฝ ๊ฐ์ Windows ๊ด๋ จ ์ํธ ์์ฉ์ ์์กดํ๋ ๋ฐฉ์์ ๋ํด ์ข ๋ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
Chrome ์ธํ๋ผ์์๋ ํ์ผ ์กด์ฌ๋ฅผ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์ด ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๋๋ฌด ๊ฑฑ์ ํ์ง ๋ง๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์ค์ ๋ก ๋ด๊ฐ ์ดํดํ ๋ฐ์ ๋ฐ๋ฅด๋ฉด O_CREATE + FILE_FLAG_DELETE_ON_CLOSE ์๋ฏธ ์ฒด๊ณ๋ ์ด๋ฌํ ์๊ตฌ์ ์ถฉ๋ถํ๋ฉฐ ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ํ์ด์ฌ ์ฝ๋ ๋ฒ ์ด์ค์์ ์ํํ๋ Global\\
๋ค์์คํ์ด์ค์ ๋ฎคํ
์ค๋ก ๋์ฒด๋ ์ ์์ต๋๋ค.
์ด ์๋ฃจ์ ์ ์ธ๊ธ๋์ง ์์์ต๋๋ค.
path := "delete-after-open"
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
if err != nil { ... }
// defer statements are executed in LIFO
defer os.Remove(path) // or defer os.Rename(path, path+"2")
if err != nil { ... }
defer fd.Close()
๋ ๊ฐ์ง ๋จ์ ์ด ์์ต๋๋ค.
@iwdgo ์ด ์๋ฃจ์ ์ ๋จ์ผ ํ๋ก์ธ์ค ์ฌ์ฉ์ ์ํ ๊ฒ์ ๋๋ค. ์์ ๋ ผ์ ๋๋ถ๋ถ์ ์ฌ๋ฌ ํ๋ก์ธ์ค์ ๋์ ์ก์ธ์ค์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ๊น๋ฐ์ ์ค์ํ๊ฒ ๋ง๋๋ ์ด์ ์ ๋๋ค.
๋ฌธ์ ์ ๋ํ @bcmills ์์ฝ ์ ๋ณด์ํ๊ธฐ ์ํด ์ธ ๊ฐ์ง ๋ค๋ฅธ ํ๋ซํผ ๊ฐ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ดํด๋ณด์์ต๋๋ค.
Mingw-w64 ๋ 7๋
์ ์ ์ด๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ์ต๋๋ค.
https://sourceforge.net/p/mingw-w64/code/HEAD/tree/stable/v3.x/mingw-w64-headers/include/ntdef.h#l858
Erlang ์ 6๋ ์ ์ ๊ทธ๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ง๋ค์์ต๋๋ค: erlang/ otp@0e02f48
Python ์ ๊ณ ๋ ค ๋น์ MSVC ๋ฐํ์์ ์ ํ์ผ๋ก ์ธํด ์ด๋ฅผ ์ฑํํ ์ ์์์ต๋๋ค. https://bugs.python.org/issue15244
๋ ๋ฒ์งธ golang-nuts ์ค๋ ๋๋ ์ด์๋ฅผ ์ ๊ธฐํ์ง ์์์ต๋๋ค.
https://groups.google.com/d/topic/golang-nuts/aRvSo3iKvJY/discussion
Open()์ ๋ํด FILE_SHARE_DELETE๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ์๊ฒ ์ต๋๊น? ์ฐ๋ฆฌ์ ๋ ผ์๋ ๊ทธ๋ ์ง ์์์ผ ํฉ๋๋ค.
- @alexbrainman ( #32088 (comment) ) ...์ ์ฐ๋ ค๋ ํ๋์ด ์ฌ์ ํ POSIX์ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ ...
๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ ์ฌ๋๋ค์ ํ๋ก๊ทธ๋จ์ ๊นจ๋ ๊ฒ์ ๋๋ค. @minux ๊ฐ https://codereview.appspot.com/8203043/#msg10 ์์ ๋งํ ๊ฒ๊ณผ ์ ์ฌํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ด์ : Windows๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๊ฑฐ๋
์ด๋ฆฐ ํ์ผ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ํ์ค์ด๋ฉฐ ์ด๋ฏธ ๊ทธ ์ฌ์ค์ ์ต์ํด์ก์ต๋๋ค.์ฌ๊ธฐ์ Go 1.0 ํ๋ก๊ทธ๋จ ๋์์ ์กฐ์ฉํ ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค. ์๋ง๋ ์ฌ๋๋ค์ด
์ค์ ๋ก ๊ทธ๊ฒ์ ์์กดํฉ๋๋ค.
Go 1.0 ํธํ์ฑ ์ฝ์์ ์ด๋ป๊ฒ ๋์๋์? https://golang.org/doc/go1compat์ ์ด๋์ go-nuts์์ ์๋๋ฅผ ๋ฐํํ๋ฉด ์ด๋ฆฐ ํ์ผ ๋์์ ๋ณ๊ฒฝํด๋ ๊ด์ฐฎ๋ค๋ ๋ด์ฉ์ด ์์ต๋๊น?
Go 2๋ฅผ ๋์ ํ๋ฉด ์ด ๋์์ ๋ณ๊ฒฝํ ์ ์์๊น์? ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ์ฝ๋๊ฐ ์์๋์ง ์๋๋ก ๋ณดํธํ ์ ์์ต๋๊น? ๊ทธ๊ฒ์ด ๋ชจ๋์ด ์ค๊ณ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๋ ๊ฒ์ด ์๋ชป๋ ๊ฒ์ ๋๊น?
๊ฐ์ธ์ ์ผ๋ก ์ด ์ค๋ ๋์ Microsoft ์ฌ๋๋ค์ด
FILE_SHARE_DELETE
๋ฅผ ์ฌ์ฉํ๋๋ก ๊ธฐ๋ณธ ๋์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ง์ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๊ฒฐ์ ์ด ๋ช ํํด ๋ณด์ ๋๋ค.
Microsoft๊ฐ ์ด ์ฃผ์ ์ ๋ํด ๊ถํ์ด ์๋ ๊ฒฝ์ฐ Microsoft ๊ฐ๋ฐ ๋๊ตฌ๊ฐ ์ํํ๋ ์์ ์ ์ดํด๋ณด์์ผ ํฉ๋๋ค.
๋๋์ด ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ https://play.golang.org/p/4ZPmV6Df3SD์ @mattn๊ฐ ๊ฒ์ ๊ฒ๊ณผ ์ ์ฌํ https://github.com/golang/go/issues/32088#issuecomment -493753714 ๋๋ ์ต๊ทผ์ C ์ปดํ์ผ๋ฌ๋ฅผ ๋ด์ฅ
x64์ฉ Microsoft (R) C/C++ ์ต์ ํ ์ปดํ์ผ๋ฌ ๋ฒ์ 19.16.27030.1
์ ์๊ถ (C) Microsoft Corporation. ํ๊ถ ์์ .
๊ทธ๋ฆฌ๊ณ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์กด์ฌํ๊ธฐ ์ ๊น์ง C:\Users\Alex\AppData\Local\Temp\a.txt
ํ์ผ์ ์ญ์ ํ ์ ์์ต๋๋ค.
๋น์ทํ C# ํ๋ก๊ทธ๋จ๊ณผ ๋์ผ https://play.golang.org/p/SuM2iWYpZir ์ต๊ทผ ์ฌ์ฉํ
Microsoft(R) Visual C# ์ปดํ์ผ๋ฌ ๋ฒ์ 2.10.0.0(b9fb1610)
์ ์๊ถ (C) Microsoft Corporation. ํ๊ถ ์์ .
๋ง์ฐฌ๊ฐ์ง๋ก ์ด C ํ๋ก๊ทธ๋จ https://play.golang.org/p/6HgxePzEW_W ๋ ์ต๊ทผ Mingw๋ก ๊ตฌ์ถ๋์์ต๋๋ค.
gcc(x86_64-win32-seh-rev0, MinGW-W64 ํ๋ก์ ํธ์์ ๋น๋) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
๊ฐ์ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ๋๊ตฌ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก FILE_SHARE_DELETE ํ๋๊ทธ๊ฐ ์ค์ ๋์ด ์์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ธ์ ์ผ๋ก ๋๋ ๊ทธ ๋ณํ์ ์ด๋ค ์ด์ ๋ ๋ณด์ง ๋ชปํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ด Go ๊ธฐ์ฌ๋ ํฌํจ๋ฉ๋๋ค. ํ๋ก์ธ์ค๊ฐ ์คํ๋๋ ๋์์๋ ์ฌ์ ํ ์คํ ํ์ผ์ ์ญ์ ํ ์ ์์ต๋๋ค. ํ๋ก์ธ์ค์ ํ์ฌ ๋๋ ํ ๋ฆฌ๊ฐ ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ ๋๋ ํ ๋ฆฌ๋ฅผ ์ญ์ ํ๋ ๋ฐ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์๋ ์ค
Open()์ ๋ํด FILE_SHARE_DELETE๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ์๊ฒ ์ต๋๊น?
์๋๋ os.Open์ด ๊ธฐ๋ณธ์ ์ผ๋ก FILE_SHARE_DELETE๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. https://golang.org/cl/194957 ์ด ๊ณํ์ ๋๋ค.
์๋ ์ค
๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ ์ฌ๋๋ค์ ํ๋ก๊ทธ๋จ์ ๊นจ๋ ๊ฒ์ ๋๋ค.
์ง๊ธ๊น์ง ์๋ฌด๋ Go๋ก ์ฐ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ์ ๊ฑฐํ๋ ค๊ณ ํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ค๋จ๋๋ ํ๋ก๊ทธ๋จ์ ๋จ์ผ ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ๋์์ผ๋ก ์ธํด Windows์์ Go ์ฑ์ด ์ค๋จ๋๋ ๋ฌธ์ํ๋ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
Go 1.0 ํธํ์ฑ ์ฝ์์ ์ด๋ป๊ฒ ๋์๋์?
os.Rename() ๋ฐ .Remove()์ ๋ํ Go ๋ฌธ์๋ ์ด Windows ๊ธฐ๋ฅ์ ๋ํด ์นจ๋ฌตํ์ง๋ง ๋ค๋ฅธ Windows ๊ด๋ จ ๋์์ ๋ํด 15๊ฐ ์ธ๊ธํฉ๋๋ค . BTW, Go 2๊ฐ ๋ฐฐ์ก๋์์ต๋๋ค: https://blog.golang.org/go2-here-we-come
gcc(x86_64-win32-seh-rev0, MinGW-W64 ํ๋ก์ ํธ์์ ๋น๋) 7.3.0
๋๊ตฌ์ C-lib๋ฅผ gcc์ ํจ๊ป ์ฌ์ฉํ๊ณ ์์ต๋๊น? ์๋ง๋ Microsoft์ ๊ฒ์ ๋๊น? Mingw-w64๋ v6.0์ ์์ผ๋ฉฐ FILE_SHARE_VALID_FLAGS์ FILE_SHARE_DELETE๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
Python์ ๋ํด ์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๊ณผ๊ฑฐ์ MSVC ๋ฐํ์์ ์ ์ ์๋ ์ด์ ๋ก ํน์ CreateFile() ํ๋๊ทธ ์กฐํฉ์ ํ์ฉํ์ง ์์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ฌ์ ํ ์ฌ์ค์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง MS๊ฐ C-lib fopen()์ ๋ณ๊ฒฝํ์ง ์์ ์ด์ ์ผ ์ ์์ต๋๋ค.
๋๋ ๊ทธ ๋ณํ์ ์ด๋ค ์ด์ ๋ ๋ณด์ง ๋ชปํ๋ค.
์ด์ ์ ์ฌ๋ฌ ์ฌ๋์ด ์์์ ๋ฐ๋ณต์ ์ผ๋ก ์ค๋ช ํ์ต๋๋ค. ํนํ ์ด๋ฆฐ ํ์ผ์์ os.Rename()์ ํ์ฉํฉ๋๋ค.
ํ ๋ก ์ด ์ฝ๊ฒ ์๋ ด๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์์ผ๋ก ํ์ํฉ๋๋ค.
์ง๊ธ๊น์ง์ ๋ฌธ์ ์ ๋ ผ์๋ฅผ ์์ฝํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Unix ์์คํ ์์ ํ ํ๋ก์ธ์ค๊ฐ ํ์ผ์ ์ด๋ฉด ๋ ๋ฒ์งธ ํ๋ก์ธ์ค๊ฐ ํด๋น ํ์ผ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์๋ ํ๋ก์ธ์ค๋ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๋ฅผ ํฌํจํ์ฌ ํ์ผ(๋ ์ด์ ์ด๋ฆ์ด ์์)์ ๊ณ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ฑ๊ณตํฉ๋๋ค. ํ์ผ ๋ด์ฉ์ ๋ง์ง๋ง์ผ๋ก ์ด๋ฆฐ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ง ๋๊น์ง ๋์คํฌ์์ ์ ๊ฑฐ๋์ง ์์ต๋๋ค.
Windows ์์คํ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ํ๋ก์ธ์ค๊ฐ ํ์ผ์ ์ด๋ฉด ๋ ๋ฒ์งธ ํ๋ก์ธ์ค๋ ํด๋น ํ์ผ์ ์ ๊ฑฐํ ์ _์์ต๋๋ค. ํ์ผ์ ์ด๋ ค ์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์์ ๋๋ง ์ ๊ฑฐํ ์ ์์ต๋๋ค. FILE_SHARE_DELETE ํ๋๊ทธ๋ ์ด ๋์์ ๋ณ๊ฒฝํฉ๋๋ค. ํ์ผ์ ๋ํ ๋ชจ๋ ์ด๋ฆฐ ์ฐธ์กฐ๊ฐ FILE_SHARE_DELETE๋ก ์ด๋ฆฐ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ DeleteFile์ ํธ์ถํ ์ ์์ผ๋ฉฐ ์คํจํ๋ ๋์ ์ฑ๊ณตํฉ๋๋ค.
FILE_SHARE_DELETE๋ฅผ ์ฌ์ฉํ Windows ๋์์ ์ฌ์ ํ โโUnix์ ๋ฏธ๋ฌํ๊ฒ ๋ค๋ฅธ ๊ฒ ๊ฐ์ต๋๋ค. MSDN ํ์ด์ง ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ด ์ผ๋ฐ I/O ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ํ์ผ๋ก ์ด๋ ค ์๋ ๋ค๋ฅธ ํธ๋ค์ด ์๋ ํ์ผ์ ์ญ์ ํ๋ ค๊ณ ํ๋ฉด DeleteFile ํจ์๊ฐ ์คํจํฉ๋๋ค(๋ค๋ฅธ ํธ๋ค์ด ์ด๋ฆด ๋ FILE_SHARE_DELETE๊ฐ ์ง์ ๋์ด์ผ ํจ).
DeleteFile ํจ์๋ ํ์ผ์ ๋ซ์ ๋ ์ญ์ ํ ํ์ผ์ ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ํ์ผ์ ๋ํ ๋ง์ง๋ง ํธ๋ค์ด ๋ซํ ๋๊น์ง ํ์ผ ์ญ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ํ์ผ์ ์ด๊ธฐ ์ํ ์ดํ์ CreateFile ํธ์ถ์ ERROR_ACCESS_DENIED์ ํจ๊ป ์คํจํฉ๋๋ค.
์ฆ, _name_ ํ์ผ์ ์ด๋ฆฐ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ง ๋๊น์ง ํ์ผ ์์คํ ์์ ์ ๊ฑฐ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ฆฐ ์ฐธ์กฐ๊ฐ ๋ซํ๊ธฐ ์ ์ ์ด๋ฆ์ด ์ฌ๋ผ์ง๋ Unix์ ๋ค๋ฆ ๋๋ค. ๋ฐ๋ผ์ ๋์ผํ ์ด๋ฆ์ ํ์ผ์ ๋ค์ ์์ฑํ๊ธฐ ์ํด ํ์ผ์ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ Unix์์๋ ์๋ํ์ง๋ง Windows์์๋ ์๋ํ์ง ์์ผ๋ฉฐ FILE_SHARE_DELETE์์๋ ์๋ํ์ง ์์ต๋๋ค.
์๋ ์ ์์ ์ด ํ๋๊ทธ๋ฅผ ํญ์ ์ค์ ํ๋๋ก syscall.Open์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด์์ต๋๋ค. syscall์ด ์ปค๋ ์ธํฐํ์ด์ค์ ๊ฐ๊น๋ค๊ณ ๊ฐ์ ํ๋ฉด ํด๋น ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ์ ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ os.Open / os.OpenFile ์ค์ ์ค์ ํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๋์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
@alexbrainman ์ Unix์ Windows๊ฐ ๋ค๋ฅด๋ฉฐ, ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๋๋ผ๋ ์ฌ์ ํ ๋ค๋ฅผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ๋ค์์ ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ํํ์ฌ ๋ฌธ์ ๋ฅผ ํผ๋ํด์๋ ์ ๋๋ค๊ณ ์ฃผ์ฅํ์ต๋๋ค.
Microsoft์ @jstarks ๋ Microsoft๊ฐ FILE_SHARE_DELETE๋ฅผ ์๋์ผ๋ก ์ค์ ํ๋ ๊ฒ์ ์ ํธํ๋ฉฐ Windows์ "์ต์ ๋ฒ์ "(์ด๋ ๊ฒ์ด ์ถ์๋์๋์ง ๋ถ๋ถ๋ช )์ด DeleteFile์์ ๋ฐํ๋ ๋ ์ด๋ฆ์ Unix ์๋ฏธ ์ฒด๊ณ๊ฐ ์ฌ๋ผ์ง๋๋ก DeleteFile์ ๋ณ๊ฒฝํ๋ค๊ณ ๋งํฉ๋๋ค. ๋ฐ๋ผ์ ์ต์ Windows์์ ์ด ์์ ์ ์ํํ๋ฉด Unix์ Windows์์ ๋์ผํ ๋์์ ์ป์ ์ ์์ต๋๋ค.
@networkimprov ๋ ์ฐ๋ฆฌ๊ฐ ๋ณ๊ฒฝํด์ผ ํ๋ฉฐ ์ค๋จ๋ ํ๋ก๊ทธ๋จ์ ์ค์ ์๊ฐ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
@alexbrainman์ ์ฌ์ ํ ํ์ ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@mattn ์ ๋ํ ๋ถ๋ถ์ ์ผ๋ก (์ ์ด๋ ๋ชจ๋ ์ฌ๋์ด ์ต์ Windows๋ฅผ ์ฌ์ฉํ ๋๊น์ง) Unix์ ๋ค๋ฅผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ๋๊ทธ๋ฅผ ์๋์ผ๋ก ์ค์ ํ์ง ์์์ผ ํ๋ค๊ณ ์ ์ํ์ต๋๋ค.
์ ๋ฐ์ ์ผ๋ก ํจํค์ง os๋ ์ด์ ๊ฐ๋ฅํ API๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํ๋ฉฐ ํนํ Windows ๋ณ๊ฒฝ์ผ๋ก ์ธํด ํ๋๊ทธ๋ฅผ ์๋์ผ๋ก ์ค์ ํ๋ฉด ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํนํ O_CLOEXEC(close-on-exec)์ ๊ฐ์ด ์ฌ์ฉ์์๊ฒ ๋ ๋๋ผ์ด ๋์์ ๋ง๋ค๊ธฐ ์ํด os.Open์์ ์๋์ผ๋ก ์ค์ ํ๋ ๋ค๋ฅธ ํ๋๊ทธ๊ฐ ์์ต๋๋ค. os.Open์์ ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ธฐ ๋๋ฌธ์ Windows์์ ์ค๋จ๋๋ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ Unix์์๋ ๋ฐ๋์ ์ค๋จ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ฃ ?
ํนํ Microsoft์ ์์ง๋์ด ์ค ํ ๋ช ์ด ์ค์ ํด์ผ ํ๋ค๊ณ ํ๋ฏ๋ก ํจํค์ง os์ ์ค์ ํด๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค. ํ๋๊ทธ ์ธํธ๋ฅผ ์ํ์ง ์๋ ์ฌ๋๋ค์ ์ฌ์ ํ โโํจํค์ง syscall๋ก ํด๋ฐฑํ ์ ์์ต๋๋ค.
@alexbrainman ๋ฐ @mattn , ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ผ๋ถ ํ๋ก๊ทธ๋จ์ด ๋ ์ ์๋ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ณ ์ฅ๋ ์ ์๋ ์ค์ (๋๋ ๊ฐ๋ฅ์ฑ์ด ์๋) ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฒด์ ์ธ ์๊ฐ ์์ต๋๊น? ์ด๋ฌํ ํ๋ก๊ทธ๋จ์ Unix์์ ์ด๋ฏธ ์ค๋จ๋์ง ์์์ต๋๊น? ๊ฐ์ฌ ํด์.
@rsc , ์ ๋ ฅํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํจํค์ง "os"์์ ์ด๊ฒ์ ํ์ฑํํ๋ฉด ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค. ์ด๊ฒ์ด ์ฑํ๋๋ฉด ์์ ์ฑ์ ์ํด FILE_SHARE_DELETE๋ฅผ ํ์ฑํํ๋ syscall.Open() ํ๋๊ทธ๊ฐ ์ ๊ณต๋์ด์ผ ํฉ๋๋ค.
์์ฝ์ ๋ช ํํ ํ๊ธฐ ์ํด ํ๋ก์ธ์ค ๊ฒฝ๊ณ๋ ์์๊ฐ ์๋๋๋ค. ํจ๊ณผ๋ ๋จ์ผ ํ๋ก์ธ์ค ๋ด์์ ๋์ผํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋๊ทธ๋ ํ์ผ ์ด๋ฆ ๋ณ๊ฒฝ์๋ ์ํฅ์ ์ค๋๋ค. ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ผ ์ญ์ ์ ๋ฌ๋ฆฌ ์ฆ์ ์๋ฃ๋ฉ๋๋ค. (๊ทธ๋ฆฌ๊ณ ์ญ์ ์งํ ํ์ผ ์ด๋ฆ ๊ฐ์ฉ์ฑ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํ์ฉํฉ๋๋ค.)
@networkimprov ๊ฐ์ฌํฉ๋๋ค. ์, ํ๋ก์ธ์ค ๊ฒฝ๊ณ๊ฐ ์๊ฒฉํ๊ฒ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ์ํฉ์ ์ค๋ช ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์ ๋ชฉ์ ๋ณ๊ฒฝํ๊ณ ๋ฌธ์ ํ ์คํธ์์ ์คํ ๊ณํ์ ์์ ํ์ต๋๋ค.
a) os.Create/Open/OpenFile()์ Windows์์ ํญ์ file_share_delete๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค.
b) Windows์ syscall.Open()์ file_share_delete๋ฅผ ํ์ฑํํ๋ ํ๋๊ทธ๋ฅผ ์๋ฝํด์ผ ํฉ๋๋ค.
c) Windows์ syscall์ ์ ํ๋๊ทธ์ ๋ํ ์์๋ฅผ ๋ด๋ณด๋ด์ผ ํฉ๋๋ค.
os.Remove() ๋ฌธ์๋ Windows์์ ์ด๋ ค ์๋ ํ์ผ์ ์ญ์ ํ ํ ํ์ผ ์ด๋ฆ์ ์ฌ์ฌ์ฉํ๋ ค๋ฉด os.Rename(path, unique_path); os.Remove(unique_path)
์ํํด์ผ ํฉ๋๋ค.
ํ์ฌ Go์ os.Open ๋์์ ์ฌ์ฉํ์ฌ ๋ฐฐํ์ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ์ฌ์ฉ์๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ์ฌ ๋์์ผ๋ก ์ธํด Windows์์ Go ์ฑ์ด ์ค๋จ๋๋ ๋ฌธ์ํ๋ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
์ด๊ฒ๋ค์ ๋ฌด์์
๋๊น? ๋ฌธ์ ๋ฒํธ๋ ๋ฌด์์
๋๊น? ๊ทธ๋ฆฌ๊ณ break
๋ผ๋ ๋จ์ด๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ๊ทธ๋ค์ ์ธ์ ๋ถ์์ก์ต๋๊น?
๋๊ตฌ์ C-lib๋ฅผ gcc์ ํจ๊ป ์ฌ์ฉํ๊ณ ์์ต๋๊น? ์๋ง๋ Microsoft์ ๊ฒ์ ๋๊น? Mingw-w64๋ v6.0์ ์์ผ๋ฉฐ FILE_SHARE_VALID_FLAGS์ FILE_SHARE_DELETE๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๋ชจ๋ฅด๊ฒ ์ด์. ๋ฐฉ๊ธ ์ธํฐ๋ท์์ x86_64-7.3.0-release-win32-seh-rt_v5-rev0.7z ํ์ผ์ ๋ค์ด๋ก๋ํ์ต๋๋ค. ๊ตฌ๊ธ๋งํ์๋ฉด ๋ฉ๋๋ค. ๋ฒ์ 7.3์ ๋๋ค.
๋๋ ๊ทธ ๋ณํ์ ์ด๋ค ์ด์ ๋ ๋ณด์ง ๋ชปํ๋ค.
์ด์ ์ ์์์ ๋ฐ๋ณต์ ์ผ๋ก ์ค๋ช ๋์์ง๋ง ...
๊ฒฌ์ ์์ personally
๋ผ๋ ๋จ์ด๋ฅผ ๋จ๊ฒผ์ต๋๋ค. ๋๋ ๋ด ์์ ์ ํ์์ ๋ํด ์ด์ผ๊ธฐํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ด Go ํ๋ก์ ํธ ๊ธฐ์ฌ๋ ํฌํจ๋ฉ๋๋ค.
์ง๊ธ๊น์ง์ ๋ฌธ์ ์ ๋ ผ์๋ฅผ ์์ฝํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Windows์ Microsoft ๊ฐ๋ฐ์ ๋๊ตฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ํ๋๊ทธ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค๊ณ ๋งํ์ง ์์์ต๋๋ค. ๋ด ์๊ฒฌ ์ฐธ์กฐ https://github.com/golang/go/issues/32088#issuecomment -531713562
Go 1 ํธํ์ฑ์ ๋ํ ๋ด ์๊ฒฌ๋ ๋ฌด์ํ์ต๋๋ค.
Go 1.0 ํธํ์ฑ ์ฝ์์ ์ด๋ป๊ฒ ๋์๋์? https://golang.org/doc/go1compat์ ์ด๋์ go-nuts์์ ์๋๋ฅผ ๋ฐํํ๋ฉด ์ด๋ฆฐ ํ์ผ ๋์์ ๋ณ๊ฒฝํด๋ ๊ด์ฐฎ๋ค๋ ๋ด์ฉ์ด ์์ต๋๊น?
์ด ๋ณ๊ฒฝ ์ฌํญ์ด Go 1.0 ํธํ์ฑ ์ฝ์์ ์ด๋ป๊ฒ ๋ถํฉํฉ๋๊น?
์ ๋ฐ์ ์ผ๋ก ํจํค์ง os๋ ์ด์ ๊ฐ๋ฅํ API๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํ๋ฉฐ ํนํ Windows ๋ณ๊ฒฝ์ผ๋ก ์ธํด ํ๋๊ทธ๋ฅผ ์๋์ผ๋ก ์ค์ ํ๋ฉด ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์ด ๋ณ๊ฒฝ์ด ์ฌ๋๋ค์ด Unix ์ํํธ์จ์ด๋ฅผ Windows๋ก ์ด์ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
๋ถํํ๋ Windows ์ฌ์ฉ์๋ฅผ ํฌ์์ํต๋๋ค. Windows์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด๋ ๋๊ตฌ๊ฐ ์ด ๋ฐฉ์์ผ๋ก ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ณ๊ฒฝ์ Windows ์ฌ์ฉ์์ ๊ฐ๋ฐ์์๊ฒ ๋๋ผ์ด ์ผ์ผ ๊ฒ์ ๋๋ค. ๋ฏธ๋์ ์์์ง๋ ๋ชจ๋ฅด์ง๋ง ์์ง์ ์๋๋๋ค.
๊ทธ๋ฆฌ๊ณ Unix ์ํํธ์จ์ด๋ฅผ Windows๋ก ์ด์ํ๋ ์ฌ๋๋ค์๊ฒ๋ ์ด ๋ณ๊ฒฝ์ IMHO์ ์ข์ง ์์ ์ํฅ์ ๋ฏธ์น๊ณ ์์ต๋๋ค. ๋ด ์๊ฒฌ์์ We still won't be able to delete executable files while process is running. We will still have problems deleting directories if any process have their current directories set there.
๋ถ๋ถ์ ์ฐธ์กฐํ์ญ์์ค. https://github.com/golang/go/issues/32088#issuecomment -531713562
ํนํ O_CLOEXEC(close-on-exec)์ ๊ฐ์ด ์ฌ์ฉ์์๊ฒ ๋ ๋๋ผ์ด ๋์์ ๋ง๋ค๊ธฐ ์ํด os.Open์์ ์๋์ผ๋ก ์ค์ ํ๋ ๋ค๋ฅธ ํ๋๊ทธ๊ฐ ์์ต๋๋ค. os.Open์์ ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ธฐ ๋๋ฌธ์ Windows์์ ์ค๋จ๋๋ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ Unix์์๋ ๋ฐ๋์ ์ค๋จ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ฃ ?
๋๋ ๋น์ ์ด ์ฌ๊ธฐ์์ ๋ฌด์์ ์๋ฏธํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. Windows์์ O_CLOEXEC๋ ํ์ผ ํธ๋ค์ด ์์ ํ๋ก์ธ์ค๋ก ํ์ถํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ O_CLOEXEC๋ ํญ์ Windows์ os.Open์ ์ค์ ๋ฉ๋๋ค. ๋ฐ๋ผ์ os.Open์ผ๋ก ์ด๋ฆฐ ํ์ผ์ Windows์ ์์ ํ๋ก์ธ์ค์์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋ฌด์? ํฉ๋ฆฌ์ ์ผ๋ก ๋ค๋ฆฝ๋๋ค.
์ด๋ฌํ ํ๋ก๊ทธ๋จ์ Unix์์ ์ด๋ฏธ ์ค๋จ๋์ง ์์์ต๋๊น?
๋๋ ๋น์ ์ ์ง๋ฌธ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
๊ณ ์ฅ๋ ์ ์๋ ์ค์ (๋๋ ๊ฐ๋ฅ์ฑ์ด ์๋) ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฒด์ ์ธ ์๊ฐ ์์ต๋๊น?
๊ทธ๋ฐ ํ๋ก๊ทธ๋จ์ด ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋งํ ์ ์์ต๋๋ค. ๋ด๊ฐ ์์ฑํ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ ๊ธฐ์ตํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ค์ดํ๋ ์ผ์ ๊ธฐ์ตํ์ง ๋ชปํฉ๋๋ค.
๊ทธ๋ฌ๋ Windows ์๋น์ค๊ฐ ๋ฏธ๋ฆฌ ์ ์๋ ํ์ผ์ ์ด๊ณ c:\mysvc.txt
๋ผ๊ณ ๋งํ๋ฉด ๊ณ์ ์ด๋ ค ์๋ค๊ณ ์์ํ ์ ์์ต๋๋ค. ์๋น์ค๊ฐ ํ์ฑ ์ํ์ธ์ง ํ์ธํ๊ณ ํ์ํ ๊ฒฝ์ฐ ์๋น์ค๋ฅผ ๋ค์ ์์ํ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์์ํด ๋ณด์ญ์์ค. ์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ c:\mysvc.txt
์ญ์ ๋ฅผ ์๋ํ๊ณ ํ์ผ์ด ์ฌ๋ผ์ง๋ฉด ์๋น์ค ํ๋ก์ธ์ค๊ฐ ์ฃฝ์๋ค๊ณ ์์ ํ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋ํ ์ผ๋ถ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์๊ฐ ํ์ผ์ ์ญ์ ํ๊ฑฐ๋ ์ด๋ํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. https://stackoverflow.com/questions/11318663/prevent-a-user-from-deleting-moving-or-renaming-a-file
์๋ ์ค
๋ค์์ Windows์์ Go์ ๋ฐ์ดํฐ ํฌ์ธํธ ์ฌ๋ฐฐํฌ์
๋๋ค.
Win8์ 7๋
์ ์ ์ถ์๋์์ต๋๋ค.
Win8+์ ์ํฅ์ ๋ฏธ์น๋ ์ด Go ๋ฒ๊ทธ๋ 5๊ฐ์ ์ ์ ๋ณด๊ณ ๋์์ต๋๋ค: #31528
@rsc Go๋ก ์ด๋ฆฐ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ์ ๊ฑฐํ๋ ค๊ณ ํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ์์๋๋ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ Unix์์ ์์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด Alex์ c:\mysvc.txt
์๋๋ฆฌ์ค์
๋๋ค.
Windows์์ ๊ฐ๋ฐํ๊ณ Linux/etc์ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ(๋๋ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง) ๋ฒ๊ทธ์ ์์ธ์ด ๋ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ์ ์ฌ์ฉ ์ฌ๋ก๋ ํ์ผ์ ๊ธฐ๋กํ๋ ๋ก๊ฑฐ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค.
๋ก๊ทธ ํ์ผ์ ํ์ ์ ์ง์ํฉ๋๋ค(์: ๋ก๊ทธ ํ์ผ์ด > maxSize์ด๋ฉด ๋ค์ ์ฐ๊ธฐ ํ ํ์ ).
๋ํ ์ด๋ฌํ ํ์ผ์ ์ด์ด ์ฝ๋ ๋์ ์ด์ด ๋๋ ํ๋
๊ธฐ๊ฐ ์์ต๋๋ค.
FILE_SHARE_DELETE
๋ฅผ ์ค์ ํ๋ ๊ธฐ๋ฅ๋ ์์ผ๋ฉด ํ์ฑ ๋
์๊ฐ ์๋ ๋์ ํ์ (์ด๋ฆ ๋ณ๊ฒฝ ๋ฐ/๋๋ ์ญ์ )์ ์ํํ ์ ์์ต๋๋ค.
@mattn :
ํ์ฌ Go์ os.Open ๋์์ ์ฌ์ฉํ์ฌ ๋ฐฐํ์ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ์ฌ์ฉ์๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ ๊ฑฐ๋ถํ ์ ์์ต๋๋ค.
๊ทธ๋ด ์๋ ์์ง๋ง ๊ทธ๋ฌํ ์ฝ๋๋ ์ด์จ๋ Unix์์ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. ํจํค์ง os๋ ์ด์ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ํ ์ฐ๋ฆฌ๋ ๊ฐ๋ฅ์ฑ๋ณด๋ค _actual_ ํ๋ก๊ทธ๋จ์ ๋ ๊ด์ฌ์ด ์์ต๋๋ค.
@alexbrainman :
Windows์ Microsoft ๊ฐ๋ฐ์ ๋๊ตฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ํ๋๊ทธ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค๊ณ ๋งํ์ง ์์์ต๋๋ค. ๋ด ๋๊ธ ๋ณด๊ธฐ #32088(๋๊ธ)
์, ํ์ง๋ง ๊ทธ๊ฒ์ C์ ๋๋ค. ์ฐ๋ฆฌ๋ Go์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก C API๋ฅผ ๋ชจ๋ฐฉํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํจํค์ง os์์ ๋๋ถ๋ถ ์ด์ ๊ฐ๋ฅํ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. O_CLOEXEC์ ๋ํ ์์ ์ Unix ์์คํ ์์ os.Open์ด ํด๋น C ํธ์ถ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋์ด ์์ง ์๋๋ผ๋ O_CLOEXEC๋ฅผ ์ค์ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์์คํ ์์ ๊ฑฐ์ ๋์ผํ๊ฒ ์๋ํ๋ ์ ์ฉํ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ๋ ค๊ณ _do_ ํฉ๋๋ค.
Go 1 ํธํ์ฑ์ ๊ดํ ํ, ํ OS์ ๋ชจ์๋ฆฌ ๋์์ ๋ค๋ฅธ OS์ ๋ ์ ๋ง๋๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ด์ฐฎ์ ๋ณด์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์์คํ ๊ฐ ๋นํธํ์ฑ์ ํญ์ ์ ์งํ๊ฒ ๋ค๊ณ ์ฝ์ํ์ง ์์ต๋๋ค.
Window ํน์ ๋์์ ์ฃผ์ฅํ๋ Windows ์ฌ์ฉ์๋ ํญ์ ํจํค์ง syscall์ ์ฌ์ฉํ ์ ์๋ ์ต์ ์ด ์์ต๋๋ค. ์ด๋ ๋๋ฌํ๋ ค๋ ๋์์ด ์ค์ ๋ก Windows์๋ง ์ ์ฉ๋๋ค๋ ๊ฒ์ ๋ถ๋ช ํ ํฉ๋๋ค.
๋ค์ ๋งํ์ง๋ง, ๊นจ์ง ์ค์ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฒด์ ์ธ ์๊ฐ ์์ต๋๊น?
@cpuguy83 , ๋์์ด ๋ ํ๋ก๊ทธ๋จ์ ์ค์ ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@rsc ๋น์ ์ด ๋งํ๋ฏ์ด, ๋๋ ์์ง FILE_SHARE_DELETE์ ํ๊ดด ํจ๊ณผ๋ฅผ ํ์ ํ์ง ๋ชปํ์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๋ณ๊ฒฝ์ผ๋ก logrotate๋ฅผ ๊ตฌํํ ์ ์๋ค๋ ํ์ธ์ ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค.
๊ทธ๋ฌ๋ Go๊ฐ ํ์ผ์ ์ญ์ ํ ์ ์๋ ์ด ๋ณ๊ฒฝ ์ฌํญ์ ํฌํจํ๋ฉด Go๊ฐ ์ด ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก Windows์์ logrotate๋ฅผ ๊ตฌํํ ์ ์๋๋ผ๋ ์ฌ์ฉ์๋ ์ด ๋์์ ์์ํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ด ๋ณํ์ ๋ํด ์ ์คํ๊ฒ ์๊ฐํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Windows๋ FILE_SHARE_DELETE ํ๋๊ทธ๊ฐ ์ง์ ๋์ง ์์ ํ์ผ์ ์ญ์ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ ์ด ๋ณ๊ฒฝ์ผ๋ก Go๊ฐ ๋ชจ๋ ํ์ผ์ ์ญ์ ํ ์ ์๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ํนํ ํธ๋ค์ด ์๋ os.NewFile์ ์ํด ์์ฑ๋ ํ์ผ์ ์ด ํ๋๊ทธ๊ฐ ์ค์ ๋์ง ์์๋ os.File ๊ตฌ์กฐ์ฒด์ ๋ฉ์๋๋ฅผ ์กฐ์ํ ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋๋จธ๋ Windows์์ ํ์ผ์ ์ญ์ ํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ์์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ ๋์ os.OpenFile์ ๋ํ ํ๋๊ทธ๋ก FILE_SHARE_DELETE๋ฅผ ์ ๋ฌํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ์ ํธํฉ๋๋ค. ๊ธฐ๋ณธ ๋์์ OS์ ๋์์ ๋ฐ๋ผ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์, ํ์ง๋ง ๊ทธ๊ฒ์ C์ ๋๋ค. ์ฐ๋ฆฌ๋ Go์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ C#๋์. ๋๋ ์กฐ์ฌํ์ง ์์์ง๋ง Windows์ ๋ค๋ฅธ ๊ฐ๋ฐ ๋๊ตฌ๊ฐ ์ด๋ฐ ์์ผ๋ก ์๋ํ๋ค๊ณ ํ์ ํฉ๋๋ค.
Go 1 ํธํ์ฑ์ ๊ดํ ํ, ํ OS์ ๋ชจ์๋ฆฌ ๋์์ ๋ค๋ฅธ OS์ ๋ ์ ๋ง๋๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ด์ฐฎ์ ๋ณด์ ๋๋ค.
Windows ์ฌ์ฉ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์์ธ์ ๋๋ค. Windows ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์ด ๋์์ ํ์ค์ ๋๋ค.
๋ค์ ๋งํ์ง๋ง, ๊นจ์ง ์ค์ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฒด์ ์ธ ์๊ฐ ์์ต๋๊น?
๊ตฌ์ฒด์ ์ธ ๋ด ์๋น์ค ์๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
@cpuguy83 , ๋์์ด ๋ ํ๋ก๊ทธ๋จ์ ์ค์ ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@cpuguy83 ๊ทํ์ ๋ฌธ์ ์ ๋ํด ๋ ์์ธํ
๊ธฐ๋ณธ์ ์ผ๋ก Windows๋ FILE_SHARE_DELETE ํ๋๊ทธ๊ฐ ์ง์ ๋์ง ์์ ํ์ผ์ ์ญ์ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ ์ด ๋ณ๊ฒฝ์ผ๋ก Go๊ฐ ๋ชจ๋ ํ์ผ์ ์ญ์ ํ ์ ์๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ข์ ์ง์ ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. Go ํ๋ก๊ทธ๋จ์์ ์ฐ ํ์ผ๋ง ์ญ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Go ํ๋ก๊ทธ๋จ์ด ์๋ ๋ค๋ฅธ ๋ชจ๋ ํ์ผ์ ์ฌ์ ํ โโ์ญ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด os.Remove๊ฐ ์์ธกํ ์ ์๊ฒ ๋ฉ๋๋ค. ์๋ํ ๋๋ ์๊ณ ์๋ํ์ง ์์ ๋๋ ์์ต๋๋ค.
์๋ ์ค
์ด๋ฆฐ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ํจ์น๋ syscall.Open()์ ํธ์ถํ๋ ์ฝ๋๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ก๊ทธ ํ์ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํจ๊ณผ๊ฐ์๋ค.
// several processes or goroutines do this
fd, err := os.OpenFile("log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, ...)
_, err = fd.Write(log_entry) // one or more times
err = fd.Close()
// log rotator process does this
err := os.Rename("log", "log_old") // active writers not disturbed
fmt.Println(err) // "sharing violation" without FILE_SHARE_DELETE
๊ทธ๋ฌ๋ ๋น์ ์ ๊ทธ๊ฒ์ ๋งํ ์ฌ๋์ด ํ์ํ์ง ์์์ต๋๋ค :-/
๋น์ฐํ os.NewFile()์ os.File์ os.Create/Open/OpenFile()์ ์์ฑ๊ณผ ๋ง์ ๋ค๋ฅธ ์์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ ๋๋ผ์ด ์ผ์ด ์๋๋ผ ๊ธฐ๋ฅ์ ๋๋ค.
Microsoft C fopen() ๋์์ด Windows ๊ธฐ๋ณธ ๋์์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค. ๊ทธ๊ฑด ์ฌ์ค์ด ์๋์ผ. CreateFile() ๊ธฐ๋ณธ ๊ณต์ ๋ชจ๋๋ ์์ต๋๋ค. FILE_SHARE_READ | FILE_SHARE_WRITE
๊ฐ ์๋๋๋ค.
๋ฐฐํฌ๋ Windows ํ๋ก๊ทธ๋จ์ ์ผ๋ฐ์ ์ผ๋ก __๋ค๋ฅธ ๊ณต๊ธ์ ์ฒด์ ํ๋ก๊ทธ๋จ__์ด ํญ์ ํน์ ๋ฐฉ์์ผ๋ก ํ์ผ์ ์ฌ๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค. ์ด ๊ฒฝ์ฐ Microsoft๋ ๊ธฐ๋ณธ์ ์ผ๋ก file_share_delete๋ฅผ ํ์ฑํํ๋๋ก ์์ฒญํ์ง ์์์ ๊ฒ์ ๋๋ค.
@networkimprov
๊ทธ๋ฌ๋ ๋น์ ์ ๊ทธ๊ฒ์ ๋งํ ์ฌ๋์ด ํ์ํ์ง ์์์ต๋๋ค :-/
์ธ๋ถ ํ๋ก์ธ์ค๊ฐ ์ด๋ค ๊ฒฝ์ฐ์๋ ํ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๊ฑฐํ๊ณ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
๋ด๊ฐ ์๊ณ ์ถ์ ๊ฒ์ ๋ณ๊ฒฝ ์ฌํญ์ ํฌํจ์ํจ ํ Go์์ ๋ก๊ทธ ํ์ผ์ด ์ถ๋ ฅ๋๊ณ ์ธ๋ถ ํ๋ก์ธ์ค์์ ์คํํ logrotate๊ฐ ์ ๋๋ก ์๋ํ๋ฉฐ ์ค๋ฅ ์์ด ํ๋ก๋์ ์ค๋น ์ํ๋ก ์๋ํ๋ค๋ ๊ฒ์ ๋๋ค.
@alexbrainman
๋ถํํ๋ ์ฝ๋๋ ๋ณต์กํ์ง๋ง ์ด๊ฒ์ ์ค์ ์ค์ ์ฝ๋์ ๋๋ค: https://github.com/moby/moby/blob/master/daemon/logger/loggerutils/logfile.go
์ ์๋ ์ํ ๋ฐฉ๋ฒ์ ํ์ฌ os.OpenFile ๋ฐ syscall.Open์ ๋ถ๊ธฐํ๋ ๊ฒ์ ๋๋ค. https://github.com/moby/moby/pull/39974/files
๋ถ๋ช
ํ ํ์๋ฉด, OpenFile์์ FILE_SHARE_DELETE
๋๋ syscall.Open
๋ก ์ ๋ฌํ๋ ์ต์
๋ง ์์ผ๋ฉด ์ด ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํ ๊ฒ์
๋๋ค.
๋ถํํ๋ ์ฝ๋๋ ๋ณต์กํ์ง๋ง ์ด๊ฒ์ ์ค์ ์ค์ ์ฝ๋์ ๋๋ค: https://github.com/moby/moby/blob/master/daemon/logger/loggerutils/logfile.go
์ ์๋ ์ํ ๋ฐฉ๋ฒ์ ํ์ฌ os.OpenFile ๋ฐ syscall.Open์ ๋ถ๊ธฐํ๋ ๊ฒ์ ๋๋ค. https://github.com/moby/moby/pull/39974/files
@ cpuguy83 ํฌ์ธํฐ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ถํํ๋ ์ด ๋ฌธ์ ๋ฅผ ๊ฐ๋ตํ ์ดํด๋ณธ ๊ฒฐ๊ณผ ํ์ฌ ๋ฌธ์ ๊ฐ ํด๊ฒฐ์ฑ ์ธ์ง ํ๋จํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ๋ชปํฉ๋๋ค. ๋๋ repro (์๋ง๋ https://github.com/moby/moby/issues/39274#issuecomment-497966709 )๋ก ์์ํ์ฌ ๊ฑฐ๊ธฐ์์ ๊ฐ์ ธ์์ผ ํ ๊ฒ์ ๋๋ค. ์ธ์ ์ด ์ผ์ ์๊ฐ์ ํ ์ ํ ์ ์์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ด ๊ณํ๋ณด๋ค ๋ ๋์ ์ ์์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค.
์๋ ์ค
์๋๋ ํ์ค ๊ดํ ๋ก๊ทธ ํ์ ์ ์์ ๋ฐ๋ชจ์ ๋๋ค. ๊ฐ ๊ณ ๋ฃจํด 100๊ฐ๋ ๋ก๊ทธ ํ์ผ์ ์ด ๋๋ง๋ค 0.1-2์ด ๊ฐ๊ฒฉ์ผ๋ก 50์ค์ ๊ธฐ๋กํ๊ณ ๋ค๋ฅธ ๊ณ ๋ฃจํด์ 1๋ถ ๊ฐ๊ฒฉ์ผ๋ก ๋ก๊ทธ๋ฅผ ํ์ ํฉ๋๋ค. ๋๋ ์ค๋ฅ๊ฐ ์๋ Win7 ๋ ธํธ๋ถ์์ ์ด์ ๋ช ์๊ฐ ๋์ ์ด๊ฒ์ ์คํํ์ต๋๋ค.
FILE_SHARE_DELETE๋ฅผ ํ์ฑํํ๋ syscall.Open()์ ๋ํ ํจ์น๋ก ๋น๋๋์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์คํจํฉ๋๋ค. ์ด ํ๋๊ทธ ์์ด ๋ ๋ณต์กํ ๋ก๊น ์ฒด๊ณ๋ฅผ ๊ตฌ์ฑํ ์ ์์ง๋ง ๋ค๋ฅธ ๋ง์ ์ฉ๋๊ฐ ์์ต๋๋ค. ๋ด ์ฝ๋๋ ๋ค๋ฅธ ์ด์ ๋ก ์ด๋ ค ์๋ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊ฟ๋๋ค.
@rsc , ์ฌ์ ํ ์์ฌ
package main
import (
"fmt"
"os"
"math/rand"
"syscall"
"time"
)
const kLogFile = "winrotate"
func main() {
syscall.Open_FileShareDelete = true
rand.Seed(time.Now().UnixNano())
for a := 0; a < 100; a++ {
go runLog()
}
fmt.Println("rotating to "+ kLogFile +"N.txt")
for a := 0; true; a++ {
if a >= 5 {
a = 0
}
time.Sleep(60 * time.Second)
err := os.Rename(kLogFile +".txt", kLogFile + string('0'+a) +".txt")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
}
const kLineVal = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
func runLog() {
aLine := make([]byte, 102)
for {
aFd, err := os.OpenFile(kLogFile +".txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
if err != nil {
fmt.Println(err)
return
}
for _, aV := range kLineVal {
for a := range aLine {
aLine[a] = byte(aV)
}
aEnd := aV - ('z' - 100) // limit line len to 100
copy(aLine[aEnd:], []byte{'\r','\n'})
_, err = aFd.Write(aLine[:aEnd + 2])
if err != nil {
fmt.Println(err)
return
}
time.Sleep(time.Duration(100 + rand.Intn(1900)) * time.Millisecond)
}
err = aFd.Close()
if err != nil {
fmt.Println(err)
return
}
}
}
syscall_windows.go์ ๋ํ ํจ์น:
diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go
index de05840..e1455d5 100644
--- a/src/syscall/syscall_windows.go
+++ b/src/syscall/syscall_windows.go
@@ -245,6 +245,8 @@ func makeInheritSa() *SecurityAttributes {
return &sa
}
+var Open_FileShareDelete = false
+
func Open(path string, mode int, perm uint32) (fd Handle, err error) {
if len(path) == 0 {
return InvalidHandle, ERROR_FILE_NOT_FOUND
@@ -270,6 +272,9 @@ func Open(path string, mode int, perm uint32) (fd Handle, err error) {
access |= FILE_APPEND_DATA
}
sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
+ if Open_FileShareDelete {
+ sharemode |= FILE_SHARE_DELETE
+ }
var sa *SecurityAttributes
if mode&O_CLOEXEC == 0 {
sa = makeInheritSa()
@networkimprov ์ธ๋ถ ํ๋ก์ธ์ค์ ์ํด ํ์ผ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ํ์ผ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๊ฐ ๋์ผํ ํ๋ก์ธ์ค์์ ์ํ๋๋ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ตฌํํ๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
https://github.com/mattn/go-sizedwriter/blob/master/_example/example.go#L14
์๋๋ ํ์ค ๊ดํ ๋ก๊ทธ ํ์ ์ ์์ ๋ฐ๋ชจ์ ๋๋ค.
@networkimprov๋ , ์๋ฅผ ๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด์ ๋น์ ์ด ๋ฌด์์ ํ๋ ค๊ณ ํ๋์ง ์ ์ ์์ต๋๋ค.
์ฝ๋์ ์ ์ผํ ๋ฌธ์ ๋ ์ผ๋ถ ์ธ๋ถ ํ๋ก์ธ์ค๊ฐ FILE_SHARE_DELETE ์์ด ์์ฑ ์ค์ธ ํ์ผ์ ์ด๋ฉด Go์์ ๋ณ๊ฒฝํ ์ฌํญ์ ๊ด๊ณ์์ด ์ง๊ธ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
@cpuguy83 @networkimprov ์์ ์์ ๊ทธ๊ฐ ์๋ํ๊ณ ์๋ ์ฌ์ง์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ (์ฌ๊ธฐ์์ ์ฝ์ํ ๋๋ก https://github.com/golang/go/issues/32088#issuecomment-536233195 ) ๊ทํ์ ๋ฌธ์ ๋ฅผ ๋ณด์ง ์์ ๊ฒ์ ๋๋ค. ํ ๊ฒ.
์๋ ์ค
Alex, ์ธ๋ถ ์ก์ธ์ค๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ์๋๋ฅผ ๋ฐ๋ณตํ๊ฑฐ๋ ํ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ ํ์ฑ ๋ก๊ทธ ํ์ผ์ ์ ํํ ์ ์์ต๋๋ค.
Mattn, ํ์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ณ๋์ ํ๋ก์ธ์ค๋ก ์ํ๋ฉ๋๋ค.
์ฌ๊ธฐ์๋ ๋ช ํํ ํฉ์๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Unix ๋ฐฐ๊ฒฝ์ ๊ฐ์ง ๊ฐ๋ฐ์๋ ์ด์ ์ฐฌ์ฑํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๊ฐ์ฅ ํ๋์ ์ธ Windows ๊ฐ๋ฐ์ ์ค ๋ ๋ช ( @alexbranman ๋ฐ @mattn)์ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ FILE_SHARE_DELETE์ ๋ํด ์๋ก์ด Unix์ ์ ์ฌํ ๋์์ด ์๋ ์ต์ ๋ฒ์ ์ Windows๋ง ํตํฉํฉ๋๋ค.
๋ช ๋ ํ์ ์ด ์ฃผ์ ๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ์ฌ ์ ํ๋๊ทธ ๋์์ด ์ผ๋ง๋ ๋๋ฆฌ ์ฌ์ฉ ๊ฐ๋ฅํ์ง์ ๋ค๋ฅธ ์ธ์ด๊ฐ ๊ณตํต ๋์์ผ๋ก ์๋ ด๋์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์ด๋ฅผ ๋ค์ ์๊ฐํ๊ธฐ ์ํด 2๋ ์ ๋ ํ์ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ณ ์ถ๋ค๋ฉด ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ํ์ฌ๋ก์๋ ํฉ์์ ๋ถ์กฑ์ ๊ฐ์ํ ๋ ์ด๊ฒ์ด ๊ฐ์ํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
์ต์ข ์๊ฒฌ์ ์ํด ์ผ์ฃผ์ผ ๋์ ์ด๋ ค ์์ต๋๋ค.
์ต์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ํ ๋ ผ์์ด ์์ต๋๊น?
์ฐ๋ฆฌ๊ฐ ์ฐจ์ํ ๋ ๋ง์ ๋ชฉ์๋ฆฌ๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด ๋๋ ํ์คํ _๋ฌด์ธ๊ฐ_๋ฅผ ํ๋ ๊ฒ์ ์ฐฌ์ฑํ ๊ฒ์ ๋๋ค. ํ์ฌ ์ ์ผํ ํด๊ฒฐ์ฑ ์ Go์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ง ๊ทธ๋๋ก ๋ง์ ์์ ์ฝ๋๋ฅผ ๋ณต์ฌํ๊ณ ํ ์ค์ ๋ณ๊ฒฝํ ๋ค์ ํด๋น ํฌํฌ๋ฅผ ์์ํ ์ ์งํ๋ ๊ฒ์ ๋๋ค. ๋ก๊ทธ ๋ชจ๋ํฐ ๋๋ ๋ผ์ด๋ธ "๊ผฌ๋ฆฌ"์ ๋ชจ๋ ๊ตฌํ์ ๊ฒฐ๊ตญ ์ด๊ฒ์ ์ํํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ฅผ ๋ณด๋ ค๋ฉด https://github.com/elastic/beats/blob/master/libbeat/common/file/file_windows.go#L85 -L103์ ์ฐธ์กฐ
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ๋๋ค๋ฉด ์ด ์ ์์ ์ค์ ๋ก ๋ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
๋ชจ๋๊ฐ 1์ ๋์ํ๋ค๋ฉด ๊ฐ๋ฐ์๊ฐ ํ๋๊ทธ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
์ง๊ธ์ ๋ช
์์ ์ผ๋ก ์์ฒญํ๊ณ ๋ช ๋
ํ์ 2๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ์ญ์์ค.
2019๋ 10์ 2์ผ ์์์ผ 19:32 Mark Dascher, [email protected]์ด ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฐจ์ ํ ๋ ๋ง์ ๋ชฉ์๋ฆฌ๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด ํ์คํ ์ฐฌ์ฑ ํ ๊ฒ์ ๋๋ค.
๋ญ๊ฐ ๋ฅผ ํ๋
Go์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฝ๋ ๋ฌถ์์ ํ ์ค ๋ณ๊ฒฝํ ๋ค์
๊ทธ ํฌํฌ๋ฅผ ์์ํ ์ ์งํ์ญ์์ค. ๋ก๊ทธ ๋ชจ๋ํฐ ๋๋ ๋ผ์ด๋ธ์ ๋ชจ๋ ๊ตฌํ
"๊ผฌ๋ฆฌ"๋ ๊ฒฐ๊ตญ ์ด๋ ๊ฒ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.์๋ฅผ ๋ณด๋ ค๋ฉด ๋ค์์ ์ฐธ์กฐํ์ญ์์ค.
https://github.com/elastic/beats/blob/master/libbeat/common/file/file_windows.go#L85 -L103โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=ABNEY4VFQLSYVI66ENT6G4LQMTLJ7A5CNFSM4HNPNYIKYY15NVWWK3TUL52HS4DFVEXG43VMVBW63LN
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABNEY4U5L3WFZYNIUOSEY2TQMTLJ7ANCNFSM4HNPNYIA
.
ํ์คํ _์ ์ด๋_๋ 1.
๊ฐ ์์ด์ผ ํฉ๋๋ค(ํ์ผ์ ์ด ๋ FILE_SHARE_DELETE ํ๋๊ทธ ์ฌ์ฉ ํ์ฉ).
๋ด ์ด์ ์ ์ ์ ๋ค์ ๋ฐฉ๋ฌธ ํ๊ณ ์์ ๊ตฌํ์ ๋ํ ํ์ ์กฐ์น ๋ฅผ ์ทจํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
syscall.FILE_SHARE_DELETE
ํ๋๊ทธ๋ os.OpenFile
์ flag
๋งค๊ฐ๋ณ์์ ์ ๋ง๊ณ ์จ๋๋งจ๋ ๋ฐฉ์์ผ๋ก ์ด ๋์์ ํ์ฑํํ๋ ๊ฐ๋จํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. Windows์ ๋ค๋ฅธ os.O_*
ํ๋๊ทธ์ ์ถฉ๋ํ์ง ์์ผ๋ฉฐ(์ด๋ฅผ ์ ์ฉ/์์ง๋์ด๋งํ ์ ์์) ์์คํ
๋ณ ํ์ผ ์ด๊ธฐ ๋์์ ์ง์ ํ๋ ๊ด์ฉ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค( os
' โ POSIX ์งํฅ ์ธํฐํ์ด์ค๋ Windows์์ ๊ด์ฉ์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ POSIX ํ๋ซํผ(์: Linux์ syscall.O_DIRECTORY
)์์ ์์คํ
๋ณ ํ์ผ ์ด๊ธฐ ๋์์ ์ ๋ฌํ๋ ๋ฐ ์ด๋ฏธ ์ฌ์ฉ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒฝ๋ก์
๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ(๋ด ์๊ฐ์ ์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ ํธ์ถ์ด๋ผ๊ณ ์๊ฐํจ), ๋๋ ํ๋๊ทธ์ ์ฌ์ฉ ์ฌ๋ก(@networkimprov๊ฐ ์ง์ ํ ๊ฒ์ ํฌํจํ์ฌ)๊ฐ ์๊ณ ๋ค์๊ณผ ๊ฐ์ด ํ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. CreateFileW
ํธ์ถ์ ์์กดํ๊ณ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ๋ ์ผค ์ ์์ต๋๋ค.
๊ฐ๋ฐ์๊ฐ ํ์ํ ๋ FILE_SHARE_DELETE
๋ฅผ ์ค์ ํ๊ณ Go ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ๋ถ๊ธฐ๋ ์ฒญํฌ๋ฅผ ๋ฐฉ์งํ๋ ์ต์
์ ํ์ฉํ๋ ์์ ๋์ [1]์ ๊ณ ๋ คํ์ญ์์ค.
__Rust__๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ณ FILE_SHARE_* ์ต์
์ค ํ๋๋ฅผ _์ค์์น ๋๊ธฐ__ ํ์ฉํฉ๋๋ค.
https://doc.rust-lang.org/std/os/windows/fs/trait.OpenOptionsExt.html
@rsc ์ ์์ ๋ํด ์ ๊ธฐ๋ ๊ธฐ์ ์ ์ฃผ์ฅ ์ค ์ด๋ค ๊ฒ์ด ๋ฐ๋ฐ๋์ง ์์๋์ง ๋ฌผ์ด๋ด๋ ๋ ๊น์?
@networkimprov ์ ์ฒด ์ ์๊ณผ ํ ๋ก ์ ์ฝ์ ํ ossyscall ํจํค์ง์ ์ ์ฐฝ ํน์ ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋ํด ๋ช ์์ ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ซ๊ณ ์ ๋ฌธ์ ๋ฅผ ๋ค์ ์ด์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ๋์์ด ์ตํธ์์์ด ์๋ ์ตํธ์ธ์ด ๋ฉ๋๋ค. ํ์ฌ ์ ์์ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ์ฌ๋๋ค์ด ๊ฑฑ์ ํฉ๋๋ค.
@rsc ์ ์์ ๋ํด ์ ๊ธฐ๋ ๊ธฐ์ ์ ์ฃผ์ฅ ์ค ์ด๋ค ๊ฒ์ด ๋ฐ๋ฐ๋์ง ์์๋์ง ๋ฌผ์ด๋ด๋ ๋ ๊น์?
์ฃ์กํ์ง๋ง ์ ์ ์ ์ฐจ ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฃผ์ฅ์ "๋ ผ๋ฐ"ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. "์ ์ ๊ณผ์ ์ ๋ชฉํ๋ ์ ์์ ๊ฒฐ๊ณผ์ ๋ํ ์ผ๋ฐ์ ์ธ ํฉ์์ ๋๋ฌํ๋ ๊ฒ์ ๋๋ค." ์์ผ๋ก ๋์๊ฐ ๋ฐฉํฅ์ ๋ํ ๋ช ํํ ํฉ์๊ฐ ์์ต๋๋ค. ๊ธฐ์ ์ ์ฃผ์ฅ์ด ์ ๊ธฐ๋์์ง๋ง Windows ํฌํธ(์ฆ, @alexbrainman ๋ฐ @mattn)์ ์๋นํ ๊ธฐ์ฌ๋ฅผ ํ ์ฃผ์ Go ๊ฐ๋ฐ์๋ฅผ ์ค๋ํ์ง ๋ชปํ์ต๋๋ค. ๋ช ํํ ํฉ์๊ฐ ๊ฒฐ์ฌ๋ ๊ฒ ์ธ์๋ ์ง๊ธ ๋น์ฅ ๋ฌด์์ ํด์ผ ํ ์๊ธ์ฑ์ ๋ํ ๋ช ํํ ์งํ๊ฐ ์์ต๋๋ค. Go๋ ์ด ๋ฌธ์ ๊ฐ ์ ๊ธฐ๋๊ธฐ ์ ๊ฑฐ์ 10๋ ๋์ Windows์์ ์ ์๋ํ์ต๋๋ค. ๋ด๊ฐ ์ดํดํ๋ ํ ๋ชจ๋ ๊ฒ์ ๊ทธ๋๋ก ๋๋ ๊ฒ์ Go๊ฐ ํญ์ ๊ทธ๋ฌ๋ ๊ฒ์ฒ๋ผ ๊ณ์ ์๋ํ ๊ฒ์์ ์๋ฏธํฉ๋๋ค.
์ด ํ์ผ์ด ๊ฑฐ๋ถ๋ (์ฌ์ ํ ๊ฐ๋ฅ์ฑ์ด ์์) ์ด๋ฒคํธ์์ FILE_SHARE_DELETE๋ก ํ์ผ์ ์ด ์ ์๋ ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ธฐ ์ํด #34681์ ์ ์ถํ์ต๋๋ค. ๋งค์ฐ ๊ธธ์ด์ง ์ด ์ค๋ ๋๋ฅผ ๊ณ์ํ๋ ๊ฒ๋ณด๋ค ๊ทธ ์์ด๋์ด๋ก ์ ํ๋ ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ํ๋ ๊ฒ์ด ๋ ๋์์ด ๋๋ ๊ฒ ๊ฐ์์ต๋๋ค.
@rsc , ๊ฑฐ์ ํ๊ธฐ ์ ์ Alex๊ฐ ๋น์ ์ O_ALLOW_DELETE ์ ์์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ๋ค์ด๋ด ์๋ค.
์ด ํ ๋ก ์ด๊ธฐ์ ๊ทธ๋ file_share_delete๋ฅผ ์ค์ ํ๋ ์๋ก์ด os.OpenFile() ํ๋๊ทธ์ ๋ฐ๋ํ์ต๋๋ค. ๊ฐ์ ์ด์ ๋ก os.Create/Open/OpenFile() ์ ์์ ๋์ํ์ง ์์์ต๋๋ค. ๊ทธ๋ MSVC fopen()์ด ๊ทธ๋ ๊ฒ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์์๋ ์๋ฌด๋ ๊ทธ๋ฐ ์์ผ๋ก ํ์ผ์ ์ด์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ์ฐ๋ คํฉ๋๋ค. ๋ฐ๋ผ์ ํด๋น(์์ง ์ง์ ๋์ง ์์) ํ๋ก๊ทธ๋จ์ ํ๋๊ทธ๋ฅผ ์ค์ ํ Go ํ๋ก๊ทธ๋จ์ ์ค๋จํฉ๋๋ค.
Alex, ์ธ๋ถ ์ก์ธ์ค๊ฐ ํ์ฉ๋๋ฉด ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ์๋๋ฅผ ๋ฐ๋ณตํ ์ ์์ต๋๋ค.
์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ฅผ ๋ฐ๋ณตํ ์ค๋น๊ฐ ๋์๋ค๋ฉด Go ๋ฆฌํฌ์งํ ๋ฆฌ ์ฝ๋์์ ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. ๊ทํ์ ํ๋ก๊ทธ๋จ์ ์ง๊ธ์ฒ๋ผ ์ ์๋ํ ๊ฒ์ ๋๋ค.
ํ์ฌ ์ ์ผํ ํด๊ฒฐ์ฑ ์ Go์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ง ๊ทธ๋๋ก ๋ง์ ์์ ์ฝ๋๋ฅผ ๋ณต์ฌํ๊ณ ํ ์ค์ ๋ณ๊ฒฝํ ๋ค์ ํด๋น ํฌํฌ๋ฅผ ์์ํ ์ ์งํ๋ ๊ฒ์ ๋๋ค.
์ฝ๋๋ฅผ ๋ณ๋์ ํจํค์ง์ ๋ณต์ฌํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. https://github.com/moby/moby/pull/39974๋ฅผ ์กฐ์ฌํ๋ ๋์ ์ ๋ ๊ฐ์ ์๊ฐ์ ํ์ต๋๋ค. ์ ์งํด์ผ ํ ์ฝ๋๊ฐ ๋ง์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ค ๋๋ ๊ทธ๊ฒ์ ๊ตฌํํ๋ค.
https://github.com/alexbrainman/goissue34681
๊ทธ๋๋ก ๋ณต์ฌํ๊ฑฐ๋ ์ฌ์ฉํ์ญ์์ค. ์๋ง๋ ์ด ๊ธฐ๋ฅ์ ๋ํ ๋ง์ ๊ด์ฌ์ด ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ณต์ ํ๊ณ ์ฌ์ฉํ ์ ์๋ ์ ์ ํ ํจํค์ง๋ฅผ ์ค์ ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ต์ ์ํ๋ก ์ ์งํ๊ณ ๋ฒ๊ทธ๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
@rsc , ๊ฑฐ์ ํ๊ธฐ ์ ์ Alex๊ฐ ๋น์ ์ O_ALLOW_DELETE ์ ์์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ๋ค์ด๋ด ์๋ค.
์ ๋ฐ, ์๋
https://github.com/alexbrainman/goissue34681
์ฒซ ๋ฒ์งธ. ์ด๋ค ์ด์ ๋ก๋ ๋ง์กฑํ์ง ๋ชปํ๋ค๋ฉด Go ๋ฆฌํฌ์งํ ๋ฆฌ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
์ด ๋ต๋ณ์ ์ ๋ง ์ค๋งํ์ต๋๋ค.
๋๋ถ๋ถ ์ดํด์กฐ์ฐจ ๋์ง ์๋ ์ด ๋ฐฉ๋ํ ์์ ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์
๋๋ค.
์ด ์์
์ ์ํํ๋ ์ด์ ) ๋จ์ผ ์ต์
์ ์ถ๊ฐํ ์ ์๋๋ก
์์คํ
์์ฒด๊ฐ ์ง์ํ๋ Go, ๋๋ถ๋ถ์ ๊ทธ๋ ์ง ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ณ ์๋ก ์ต์
์ ์ ๋ฌํ ์๋จ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
syscall.Open์ ํฐ๋ฌด๋์๋ ์ํฉ์ฒ๋ผ ๋ณด์
๋๋ค.
์ด ์ต์ ์ ์ ๋ฌํ๊ธฐ ์ํด syscall.Open์ ๋ค์ ์์ฑํด์ผ ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
2019๋ 10์ 5์ผ(ํ ) 18:43 Alex Brainman [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
Alex, ์ธ๋ถ ์ก์ธ์ค๊ฐ ํ์ฉ๋๋ฉด ์ด๋ฆ ๋ฐ๊พธ๊ธฐ ์๋๋ฅผ ๋ฐ๋ณตํ ์ ์์ต๋๋ค.
์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ฅผ ๋ฐ๋ณตํ ์ค๋น๊ฐ ๋์๋ค๋ฉด ์๋ฌด ๊ฒ๋ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค.
Go repo ์ฝ๋์์. ๊ทํ์ ํ๋ก๊ทธ๋จ์ ์ง๊ธ์ฒ๋ผ ์ ์๋ํ ๊ฒ์ ๋๋ค.์ง๊ธ ๋น์ฅ์ ์ ์ผํ ํด๊ฒฐ์ฑ ์ ๋ง ๊ทธ๋๋ก ์ฌ๋ฌ ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ ๋๋ค.
Go์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํ ์ค์ ๋ณ๊ฒฝํ ๋ค์ ํด๋น ํฌํฌ๋ฅผ ์์ํ ์ ์งํฉ๋๋ค.์ฝ๋๋ฅผ ๋ณ๋์ ํจํค์ง์ ๋ณต์ฌํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. ์กฐ์ฌํ๋ฉด์
moby/moby#39974 https://github.com/moby/moby/pull/39974 ๋๋ ๊ฐ์ ๊ฒ์ ์ป์๋ค
์์ด๋์ด. ์ ์งํด์ผ ํ ์ฝ๋๊ฐ ๋ง์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ค ๋๋
๊ทธ๋ฅ ๊ตฌํhttps://github.com/alexbrainman/goissue34681
๊ทธ๋๋ก ๋ณต์ฌํ๊ฑฐ๋ ์ฌ์ฉํ์ญ์์ค. ์๋ง๋ ๊ด์ฌ์ด ๋๋ฌด ๋ง๋ค๋ ์ ์ ๊ฐ์ํ ๋
์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ค์ ๋ก ๊ณต์ ํ ์ ์๋ ์ ์ ํ ํจํค์ง๋ฅผ ๋ง๋ญ๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ต์ ์ํ๋ก ์ ์งํ๊ณ ๋ฒ๊ทธ๋ฅผ ์์ ํ ์ ์์ต๋๋ค.@rsc https://github.com/rsc , ์ด๊ฒ์ ๊ฑฐ๋ถํ๊ธฐ ์ ์ ๋ฌด์์ ๋ฃ๊ณ
Alex๋ ๋น์ ์ O_ALLOW_DELETE ์ ์์ ์๊ฐํฉ๋๋ค.์ ๋ฐ, ์๋
https://github.com/alexbrainman/goissue34681
์ฒซ ๋ฒ์งธ. ์ด๋ค ์ด์ ๋ก ๋ง์กฑํ์ง ์์ผ๋ฉด ์๋ก์ด ์ถ๊ฐ์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๋ค.
๊ธฐ๋ฅ์ Go ์ ์ฅ์๋ก ์ด๋ํฉ๋๋ค.๊ฐ์ฌํฉ๋๋ค.
์๋ ์ค
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=AAGDCZXHULQEMHAPTO6ZUJTQNFGE7A5CNFSM4HNPNYIKYY3PNVWWK3TUL52HS4DFVEXG43VMXQHJDNMV
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAGDCZWYUNMCTAGO567AV73QNFGE7ANCNFSM4HNPNYIA
.>
์ด ๋ต๋ณ์ ์ ๋ง ์ค๋งํ์ต๋๋ค.
๊ทธ๋ ๊ฒ ๋๋ผ์ จ๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ค์ ๋ก ๋ด ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ต๋๊น?
์๋ ์ค
@rsc , Alex๋ os.OpenFile() ํ๋๊ทธ์ ๋ฐ๋ํ๋ฏ๋ก ์๋ฌด ๊ฒ๋ ํ์ง ์์์ผ ํฉ๋๊น?
์ด ๊ธฐ๋ฅ์ ๋น๋ ํ๋๊ทธ ๋ค์ ๋๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
"Go๊ฐ ๊ฑฐ์ 10๋ ๋์ Windows์์ ์ ์๋ํ๋์ง" ์ฌ๋ถ์ ๊ดํด์๋ ์ด๋ ค ์๋ ํ์ผ์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผ ํ๋ ๊ฒฝ์ฐ ํ์คํ ๊ทธ๋ ์ง ์์์ต๋๋ค. (์ง๋ 7๋ ๋์ Windows 8/10 ๋ ธํธ๋ถ์์๋ ๊ณ ์ฅ๋ฌ์ต๋๋ค.)
๋ด ์์ ์ os.OpenFile ๋ฐ syscall.Open ํฌํฌ๊ฐ ์ด๋ฏธ moby/moby์ ์์ต๋๋ค.
์ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์์ ๊ทธ๋ ๊ฒ ๋ฌด์ํฉ๋๊น?
2019๋ 10์ 8์ผ ํ์์ผ 01:47 Alex Brainman [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ด ๋ต๋ณ์ ์ ๋ง ์ค๋งํ์ต๋๋ค.
๊ทธ๋ ๊ฒ ๋๋ผ์ จ๋ค๋ฉด ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ค์ ๋ก ๋ด ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ต๋๊น?
์๋ ์ค
โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=AAGDCZRV72GY4IJQJVJWMYTQNRCIHA5CNFSM4HNPNYIKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAGDCZRNYSMIE6BX77XJVWDQNRCIHANCNFSM4HNPNYIA
.>
๋๋ ์ด ํน์ ํ ์ ์์ ๊ฑฐ์ ํ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ os.OpenFile์ ๊ธฐ์กด ๋์์ ์์กดํ๋ Windows ์ฌ์ฉ์๋ฅผ ์ํด TOCTOU ๋ณด์ ๋ฒ๊ทธ๋ฅผ ๋ง์ด ์๊ฐํ์ง ์์ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ ๋ ํฐ ์ง๋ฌธ์ "Windows์ CreateFile
๋ฐ NtCreateFile
๊ธฐ๋ฅ์ ๋ํด ๋ค์ํ๊ณ ํฅ๋ฏธ๋ก์ด ํ๋๊ทธ๋ฅผ Go ์ฌ์ฉ์์๊ฒ ์ด๋ป๊ฒ ๋
ธ์ถํ ์ ์์ต๋๊น?"์
๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฅธ ์ ์์์ ๊ทธ๊ฒ๋ค์ ๋ค๋ฃฐ ์ ์์ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง๋ง, ํ์คํ ์ฌ๊ธฐ์์ ์ ์ํ๋ ๊ฒ์ฒ๋ผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๊ฒ๋ค์ ๋ชจ๋ ์ผ๋ ๊ฒ์ ์๋๋๋ค.
@zx2c4 ์ ์ฒด ์ค๋ ๋๋ฅผ ์ฝ์์ต๋๊น? ๋ฐ๋ณต์ ์ธ ์๋์๋ ๋ถ๊ตฌํ๊ณ ๊ธฐ์กด์ ๋ฌธ์ํ๋์ง ์์ ํ๋์ ์์กดํ๋ Go ์ฌ์ฉ์์ ์ฌ๋ก๋ ๋จ ํ ๊ฑด๋ ์๋ณํ ์ ์์์ต๋๋ค.
https://github.com/golang/go/issues/32088#issuecomment -537590826 ์ดํ ์ผ์ฃผ์ผ์ด ์ง๋ฌ์ง๋ง ์ฌ์ ํ ๋ช ํํ ํฉ์๊ฐ ์ด๋ฃจ์ด์ง์ง ์์ ์ด๋ฅผ ๊ฑฐ๋ถํด์ผ ํฉ๋๋ค.
๊ฑฐ๋ถ๋จ
https://github.com/golang/go/issues/34681#issuecomment -565853605์ ์ฅ๋จ์ ์ด ์๋ ์ต์ ์์ฝ์ ๊ฒ์ํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ๊ธฐ์์ Windows ํ์ ๊ด์ ์ ํํํ๋ ค๊ณ ํฉ๋๋ค. ์ต์ ์์ด ํญ์ FILE_SHARE_DELETE๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Windows๋ก/์์ ์ฝ๊ฒ ํฌํ ํ ์ ์๋๋ก Linux์์ ์ผ๊ด๋ ๋์์ ์ ํธํ๋ฉฐ Windows ์ฌ์ฉ์ ๋๋ ์ํํธ์จ์ด๊ฐ ๊ท์น์ ์์ธ๊ฐ ๋๊ธฐ์ ์ถฉ๋ถํ ๊ธฐ๋ณธ !FILE_SHARE_DELETE ๋์์ ์ ํธํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@mattn ์ ์๊ฒฌ๊ณผ ๋ฌ๋ฆฌ ํฅ๋ฏธ๋ก์ด ์ฐธ๊ณ ์ฌํญ: ์ต์ ๋ฒ์ ์ Windows์์๋ "POSIX" ์ญ์ ๋ฅผ ์ํํ๋๋ก DeleteFile(NTFS์์)์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ๋ซ์ ํ์ผ์ ๋ํ ํธ๋ค์ ๋๋ค. ์ฌ์ ํ FILE_SHARE_DELETE๋ฅผ ์กด์คํ์ง๋ง ์ด์ POSIX ์ฐ๊ฒฐ ํด์ ์ ๊ฐ์ด ์๋ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ WSL์ฉ์ผ๋ก ์ถ๊ฐ๋์์ผ๋ฉฐ Windows ์ํํธ์จ์ด์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ๊ฐ์น๊ฐ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์์ต๋๋ค.
์ฆ, ์ต์ ๋ฒ์ ์ Windows์์ mattn์ ํ ์คํธ ํ๋ก๊ทธ๋จ๊ณผ del, dir ๋ฑ์ ์ํ์ค๋ฅผ ์คํํ๋ฉด ํ ์คํธ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ์งํ๊ฐ ์๋๋ผ ํ์ผ ์ญ์ ์งํ ๋ค์์คํ์ด์ค์์ ํ์ผ์ด ์ฌ๋ผ์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋ง์น ๋ฆฌ๋ ์ค์ฒ๋ผ.
๋ฐ๋ผ์ Windows ์์ฒด์์๋ ์ฑ ํธํ์ฑ ์ํ์ด ํจ์ฌ ๋ ํฌ์ง๋ง Windows๊ฐ ์๋ ์ํํธ์จ์ด๋ฅผ Windows๋ก ์ฝ๊ฒ ์ด์ํ ์ ์๋๋ก ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ ๊ฐํ๊ณ ์์ต๋๋ค. ๋๋ Go๊ฐ ๊ทธ๋ ๊ฒ ํ๋๋ก ์ ๋ง๋ก ๊ฒฉ๋ คํ๋ค.