мульти процесс, чтобы изменить модель файла, это вызовет конкуренцию? - PullRequest
0 голосов
/ 26 июня 2019

мультипроцесс в то же время, чтобы изменить режим файла (или метаданные других файлов), как это, это вызовет неопределенное состояние ?

from multiprocessing import process
import os
import stat
func = stat.fchmod
p1 = process(func, args=("somefile", stat.S_IEXEC))
p2 = process(func, args=("somefile", stat.S_IREAD))
p1.start()
p2.start()
p1.join()
p2.join()
# what this will be, some random value or decided by which process executed last?

os.stat("somefile").ST_MODE

1 Ответ

1 голос
/ 26 июня 2019

С помощью приведенного выше кода вы можете оказаться в одном из следующих случаев:

  1. Пользователь имеет разрешение на выполнение для "somefile"
  2. Пользователь имеет разрешение на чтение для "somefile"
  3. Пользователь имеет и разрешение на чтение и выполнение для "somefile"

Причина в том, что существует состояние гонки из-за неатомичности базового 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;
        }
    }
}

Функция mode_adjust реализована в modechange.c gnulib.Он включает или выключает биты в старом режиме в соответствии с запрошенным изменением и возвращает значение нового режима.Когда две операции chmod выполняются параллельно, может случиться так, что обе они получат исходный режим исходного файла;тогда они оба вычисляют требуемый new_mode.С другой стороны, возможно также, что два chmod выполняются последовательно, и, таким образом, последний режим файла представляет собой «сумму» двух операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...