Python 多进程更改文件模型,这会导致竞争吗?

Python 多进程更改文件模型,这会导致竞争吗?,python,operating-system,Python,Operating System,多进程同时更改文件模式或其他文件元数据之类的,这会导致未定义状态吗 从多处理导入进程 导入操作系统 进口统计 func=stat.fchmod p1=processfunc,args=somefile,stat.S\u IEXEC p2=processfunc,args=somefile,stat.S\u IREAD p1.开始 p2.开始 p1.加入 p2.加入 这将是什么,一些随机值或由最后执行的进程决定? os.statsomefile.ST_模式 使用上述代码,您可能会出现以下情况之一:

多进程同时更改文件模式或其他文件元数据之类的,这会导致未定义状态吗

从多处理导入进程 导入操作系统 进口统计 func=stat.fchmod p1=processfunc,args=somefile,stat.S\u IEXEC p2=processfunc,args=somefile,stat.S\u IREAD p1.开始 p2.开始 p1.加入 p2.加入 这将是什么,一些随机值或由最后执行的进程决定? os.statsomefile.ST_模式
使用上述代码,您可能会出现以下情况之一:

用户对某个文件具有执行权限 用户对某个文件具有读取权限 用户对某个文件同时具有读取和执行权限 原因是,由于底层C chmod实现的非原子性,存在竞争条件。检查实用程序的源代码:

mode_adjust函数在gnulib的modechange.c中实现。它根据请求的更改打开或关闭旧模式中的位,并返回新模式值。 当两个chmod操作并行运行时,可能两个操作都获取原始文件的原始模式;然后它们都计算所需的新模式。另一方面,也可能是两个chmod顺序执行,因此文件的最终模式是两个操作的总和

if (ok)
{
  old_mode = file_stats->st_mode;
  new_mode = mode_adjust (old_mode, S_ISDIR (old_mode) != 0, umask_value,
                          change, NULL);

  if (! S_ISLNK (old_mode))
    {
      if (chmodat (fts->fts_cwd_fd, file, new_mode) == 0)
        chmod_succeeded = true;
      else
        {
          if (! force_silent)
            error (0, errno, _("changing permissions of %s"),
                   quoteaf (file_full_name));
          ok = false;
        }
    }
}