Chdir和Setuid和Setgid线程是否安全?

Kha*_*ash 1 multithreading go

os. Chdir,os.Setuidos.Setgid线程安全的进去吗?

换句话说,如果我os.Chdir在两个不同的并行运行的goroutine中执行(或其他两个函数),它是否会更改工作goroutine或整个过程的目录(这可能会导致问题)?

我在文档中找不到任何信息.

Tho*_*mas 6

引擎盖下,os.Chdir只是调用chdir()系统调用:

   211  func Chdir(dir string) error {
   212      if e := syscall.Chdir(dir); e != nil {
   213          return &PathError{"chdir", dir, e}
   214      }
   215      return nil
   216  }
Run Code Online (Sandbox Code Playgroud)

所以它影响整个过程.对于os.Setuid和,情况也是如此os.Setgid.

从多个goroutine同时调用它们可能是安全的,因为执行系统调用会停止调度程序; 但要注意竞争条件.

  • @Khash,我相信在发明这些系统调用时,没有OS线程这样的东西,所以当前目录的属性本身就是每个进程.您可能想重新考虑解决问题的方法:比如,在每个goroutine中保留目录路径名,并使用`path/filepath`构建*full*pathnames,以便在需要时为每个goroutine进行操作.另一种方法是创建一个辅助包,包装特定于OS的系统调用,例如Linux的[`openat()`(http://linux.die.net/man/2/openat),并且每个goroutine保留一个目录FD有"私人"cwds. (2认同)