Go: ์ œ์•ˆ: os: Windows์—์„œ FILE_SHARE_DELETE๋ฅผ ์„ค์ •/์—ด๊ธฐ/OpenFile() ์„ค์ •

์— ๋งŒ๋“  2019๋…„ 05์›” 16์ผ  ยท  194์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: golang/go

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 ์ถ”๊ฐ€

FrozenDueToAge OS-Windows Proposal Proposal-FinalCommentPeriod release-blocker

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ฌ๊ธฐ์—์„œ 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๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋„๋ก ์ •๋ง๋กœ ๊ฒฉ๋ คํ•œ๋‹ค.

๋ชจ๋“  194 ๋Œ“๊ธ€

/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"๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

image

ํŒŒ์ผ์€ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š” ๋™์•ˆ์—๋Š” ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋””๋ ‰ํ† ๋ฆฌ ํ•ญ๋ชฉ์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ์—ด๊ธฐ ์œ„ํ•œ ์ดํ›„์˜ 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๋„

์ €๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์‹ค์— ๋™์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ์š”์•ฝํ•˜๊ณ  ํ–‰๋™ ๋ฐฉ์นจ์„ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ๋™์˜: Windows์™€ POSIX๋Š” ์œ„์˜ ๋™์ž‘์ด ๋‹ค๋ฅด๋ฏ€๋กœ ๋™์ผํ•œ ๋™์ž‘์„ ๋ชฉํ‘œ๋กœ ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  2. ๋™์˜: FILE_SHARE_DELETE๋ฅผ ํ”Œ๋ž˜๊ทธ๋กœ ํ—ˆ์šฉํ•˜๋Š” ์š”์ฒญ์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  3. ์ œ์•ˆ: ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ ์š”์ฒญ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋„๋ก ํ‹ฐ์ผ“์„ "์ง€์› FILE_SHARE_DELETE"๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  4. ๋Œ€๋ถ€๋ถ„ ๋™์˜: ์ด ๊ธฐ๋Šฅ์€ ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹Œ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ค€์˜ ๊ฐœ๋ฐœ์ž ํ”Œ๋ž˜๊ทธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ํ•ญ๋ชฉ:

  1. syscall_windows.go ๋ณ€๊ฒฝ
    ํ•จ์ˆ˜ ์—ด๊ธฐ(
    ...
    ๊ณต์œ  ๋ชจ๋“œ := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | (๋ชจ๋“œ ๋ฐ FILE_SHARE_DELETE) )
  2. ์ด ๋™์ž‘์„ ํ™œ์šฉํ•˜๋ ค๋Š” ๊ฐœ๋ฐœ์ž๋Š”
    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 ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ˜์˜ํ•˜๋ฉด ๋‹ค์Œ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  1. File_share_delete๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ™˜๊ฒฝ์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฃผ์˜ ์‚ฌํ•ญ์€ ์›๋ž˜ ํŒŒ์ผ ์ด๋ฆ„์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๊ฐ€ ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์ง์ „์— ๊ณ ์œ ํ•œ ์ด๋ฆ„์œผ๋กœ ํŒŒ์ผ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ).
  2. ๋Œ€๋ถ€๋ถ„์˜ Windows ํ”„๋กœ๊ทธ๋žจ์€ ๋‹จ์ˆœํžˆ MSVC ๋Ÿฐํƒ€์ž„์ด O_TEMPORARY์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— file_share_delete๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ 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๊ฐ€ ๋งํ•œ ๊ฒƒ. ๊ทธ๋Ÿฌ๋‹ˆ ์ด๊ฒƒ๋„ ๋ฌด์‹œํ•ฉ์‹œ๋‹ค.

๋‹ค์‹œ ๋งํ•ด์„œ ์ด ์˜๊ฒฌ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ ์ด๋Ÿฌํ•œ ์ œ์•ˆ์„ ๋ฌด์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • POSIX์™€ ๋˜‘๊ฐ™์ด ํ–‰๋™ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์˜ตํŠธ์•„์›ƒ(๋˜๋Š” ์˜ตํŠธ์•„์›ƒ ์—†์Œ)์œผ๋กœ ์ „์—ญ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถ„๋ช…ํžˆ Windows ๊ณ ์œ ์˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ˜ธ์ถœ๋ณ„ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ @guybrand๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mattn ์ด์˜ ์ œ๊ธฐ๊ฐ€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @guybrand๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ Windows๋Š” ํŒŒ์ผ ๊ณต์œ ์™€ ๊ด€๋ จํ•˜์—ฌ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์‚ญ์ œ ๊ถŒํ•œ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ Windows์—์„œ๋Š” ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค . ์ด๋ฏธ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋กœ ๊ฐˆ๋ผ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. "๊ฐœ๋ฐœ์ž๊ฐ€ ๊ทธ ๋™์ž‘์„ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค"๋Š” ์ž…์žฅ์—์„œ Windows ์ „์šฉ ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•ด ์ด์˜๋ฅผ ์ œ๊ธฐํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ผ ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์‹ ์ด ํ•˜๋Š” ์ผ์„ ๋ชจ๋ฅด๊ฑฐ๋‚˜ MSDN์˜ ์„ค๋ช…์„œ๋ฅผ ์ฝ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ๐Ÿ˜Ž์— ๋Œ€ํ•œ ์ •๋‹นํ•œ ์ด์˜์ž…๋‹ˆ๋‹ค๋งŒ, ์ ๋ฒ•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์„ ํƒ์  ํ”Œ๋ž˜๊ทธ๋กœ ์ฐจ๋‹จํ•œ๋‹ค๋Š” ์ด์œ ๋กœ ๊ฐ•๋ ฅํ•œ ์ด์˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ์ด๊ฒƒ์€ ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ #25965๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด CreateFileW ์ง์ ‘ ํ˜ธ์ถœํ•˜๋„๋ก 'go run'์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด FILE_FLAG_DELETE_ON_CLOSE ๋„ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

์ƒˆ ์†์„ฑ์ด ์žˆ๋Š” ํŒŒ์ผ์„ ์—ด๊ฑฐ๋‚˜ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ƒˆ ๊ธฐ๋Šฅ(golang.org/x/sys?)์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์›๋ž˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด ์ผ€์ด์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ์กด์žฌํ•˜๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ„์˜ ์˜๊ฒฌ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ํ•œ:

  1. ๋กœ๊น…์„ ์œ„ํ•ด ์‚ญ์ œ ๊ฐ€๋Šฅํ•œ(์ด๋ฆ„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ) ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‹ซ์„ ๋•Œ ์‚ญ์ œ๋  ์ž„์‹œ ํŒŒ์ผ์— ๋Œ€ํ•œ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

1์˜ ๊ฒฝ์šฐ ์†์„ฑ์ด ์žˆ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑ/์—ด๊ธฐ ์œ„ํ•ด ์ƒˆ ํ•จ์ˆ˜์—์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  logger.SetOutput(file)์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์œผ๋กœ ์ƒ์„ฑ/์—ด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

BTW, ๋‚˜๋Š” # 25965๊ฐ€ ์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ Windows์˜ ํ•œ๊ณ„์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(์–ด์จŒ๋“  ์ด ์†์„ฑ์œผ๋กœ ์—ด๋ฆฐ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค)

@mattn ๋‹ค์Œ ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  • golang.org/x/sys์— ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • OpenFile()์— ๋Œ€ํ•œ ์ƒˆ ํ”Œ๋ž˜๊ทธ(์ด๋ฏธ ์ •์˜๋จ!)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. [1]

์™œ ์šฐ๋ฆฌ๊ฐ€ ๋‘ ๋ฒˆ์งธ ๋Œ€์‹  ์ฒซ ๋ฒˆ์งธ๋ฅผ ์„ ํ˜ธํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

[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 ์™€ @

  • os.OpenFile()์ด FILE_SHARE_DELETE(๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ ์ž ์žฌ์ ์ธ ํ›„์† ์กฐ์น˜๋กœ FILE_FLAG_DELETE_ON_CLOSE)๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ๋ช…์‹œ์ ์ธ ์˜๋„ ๋กœ syscall.Open()์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด Windows ์ „์šฉ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด os.OpenFile() ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์‹ญ์‹œ์˜ค.
  • os.OpenFile(), os.Rename() ๋ฐ os.Remove() ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ POSIX์™€ Windows ๊ฐ„์˜ ๋™์ž‘ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜์‹ญ์‹œ์˜ค.

์„ธ ๋ฒˆ์งธ ์š”์ ์€ @networkimprov ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ์€ ๋ฌธ์„œ๋ฅผ ๋ณด์ฆํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋ฏธ๋ฌ˜ํ•˜๋‹ค๋Š” ๋ฐ

์Šน์ธ์ด ๋œ๋‹ค๋ฉด ๊ธฐ๊บผ์ด ๊ธฐ์—ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถ„๋ช…ํžˆ Windows ๊ณ ์œ ์˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ˜ธ์ถœ๋ณ„ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด os.Open ํ”Œ๋ž˜๊ทธ๋ฅผ ์ œ์•ˆํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”Œ๋ž˜๊ทธ๋Š” ๋ชจ๋“  OS์—์„œ ์ง€์›๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, OS ํŒจํ‚ค์ง€์˜ ์š”์ ์€ OS ๋…๋ฆฝ์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ฌธ์„œํ™”๋œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

syscall ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ Windows ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ž˜ ๊ณต์กดํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠน๋ณ„ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ๊ดœ์ฐฎ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด ๊ธฐ๋Šฅ์„ ๊ฐ€๋ณ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ผ๋ถ€๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์•Œ๋ ‰์Šค

@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).

  1. ์กฐ์ • syscal_windows.go
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)

๋ณ€ํ™”๋ฅผ "๋Š๋‚„" ๊ฒƒ์ž…๋‹ˆ๋‹ค

  1. ์ฝ”๋“œ๋ฅผ ์‹คํ–‰
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())
    }
}

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋‹ค

  1. |4 ์—†์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ์•ฝ๊ฐ„์˜ ์ถ”๊ฐ€๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
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์—์„œ ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/apache/hadoop/search?q=getShareDeleteFileInputStream&unscoped_q=getShareDeleteFileInputStream

@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์—์„œ ์ด์‹ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ž์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  1. Open ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์˜ตํŠธ์ธ ํ”Œ๋ž˜๊ทธ๋Š” Windows์˜ ๊ฒฝ์šฐ FILE_SHARE_DELETE ๋ฅผ ์˜๋ฏธํ•˜๊ณ  ๋‹ค๋ฅธ OS์—์„œ๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ POSIX ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ชจ๋“  ๊ณณ์—์„œ ์ „๋‹ฌํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š”,
  2. CreateFile์„ FILE_SHARE_DELETE๋กœ ๋ž˜ํ•‘ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด os.Open ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” Open ๋ผ๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ์ƒˆ๋กœ์šด Go ํŒจํ‚ค์ง€ posix (์–ด๋”˜๊ฐ€์˜ ์ผ๋ถ€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์žˆ์Œ). Windows๊ฐ€ ์•„๋‹Œ ํ”Œ๋žซํผ์—์„œ๋Š” os.Open ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ๋‹ค์Œ ์‚ฌ์šฉํ•˜๋Š” POSIX ์˜๋ฏธ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค posix.Open ๋Œ€์‹  os.Open ์‚ฌ๋ฐฉ.

์ด ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹ ๋ชจ๋‘ Linux ๊ฐœ๋ฐœ์ž๋Š” Windows์—์„œ POSIX ๋™์ž‘์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์กฐ์น˜๋ฅผ ์ทจํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ ์–ด๋„ ์ด๊ฒƒ์€ ์ผํšŒ์„ฑ CreateFile ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

์•Œ๋ ‰์Šค, ๋‹น์‹ ์ด ์„ค๋“๋ ฅ์ด ์—†๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์„ค๋“๋˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๋‚˜๋ฅผ ์„ค๋“ํ•  ํ•„์š”๋Š” ์—†๊ณ , ๋ฐ”๋‘‘ํŒ€์„ ์„ค๋“ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋“ค์€ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. 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 ์•„๋ฌด๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ ๋‚ด๊ฐ€ ๋ณธ ๋ฐ˜๋Œ€ ์˜๊ฒฌ์€ ๋‘ ๊ฐ€์ง€ ๋ฒ”์ฃผ๋กœ ๋ถ„๋ฅ˜๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. @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 ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ์šฐ๋ ค๋Š” ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.)

  2. @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()

๋‘ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Close()๊ฐ€ Open() ๋ฐ”๋กœ ๋’ค์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค

@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๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ์˜ ๋…ผ์˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. @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. ํŒŒ์ผ์„ ์—ด ๋•Œ FILE_SHARE_DELETE ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ ํ—ˆ์šฉ -
    ๊ตฌํ˜„์€ ์‰ฝ๊ณ  ์•ˆ์ „ํ•ด์•ผ ํ•˜๋ฉฐ ๊ฐœ๋ฐœ์ž๋Š” ๋ช…์‹œ์ ์œผ๋กœ
    ์ƒˆ ํŒŒ์ผ์„ ์—ด ๋•Œ ์ด ๋ชจ๋“œ๋ฅผ ์š”์ฒญํ•˜์‹ญ์‹œ์˜ค
  2. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ผœ์‹ญ์‹œ์˜ค - ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž˜ ์ง€์›๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ
    ๋งˆ์ง€๋ง‰ Windows 10 ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ.

๋ชจ๋‘๊ฐ€ 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์— ์žฅ๋‹จ์ ์ด ์žˆ๋Š” ์˜ต์…˜ ์š”์•ฝ์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰