Удаление возможно заблокированного файла в c - PullRequest
2 голосов
/ 05 мая 2010

Я использую блокировки fcntl в C в Linux и имею дилемму при попытке удалить файл, который может быть заблокирован из других процессов, которые также проверяют механизм блокировки fcntl. Каков предпочтительный способ обработки этого файла, который должен быть удален (Должен ли я просто удалить файл без учета других процессов, которые могут иметь блокировки чтения или есть лучший способ)? Любая помощь будет высоко ценится.

Ответы [ 3 ]

2 голосов
/ 05 мая 2010

В системах UNIX можно отсоединить файл, пока он еще открыт; это уменьшает счетчик ссылок на файл, но фактический файл и его индекс остаются примерно до нуля.

1 голос
/ 05 мая 2010

Как уже отмечали другие, вы можете удалить файл, даже удерживая блокировку.

Теперь, предостережение: вы не упомянули, почему процессы блокируют этот файл, но вы должныИмейте в виду, что если вы используете этот файл для межпроцессной синхронизации, его удаление является хорошим способом введения в вашу систему незаметных условий гонки, в основном потому, что нет способа атомарно создать И заблокировать файл за одну операцию.

Например, процесс AA может создать файл с намерением немедленно заблокировать его для выполнения любых необходимых ему обновлений.Однако ничто не мешает процессу BB сначала захватить блокировку файла, а затем удалить файл, оставив процесс AA с дескриптором удаленного файла.Процесс AA по-прежнему сможет блокировать и обновлять этот файл, но эти обновления будут фактически «потеряны», поскольку файл уже удален.

0 голосов
/ 05 мая 2010

Более того, блокировки в системе UNIX рекомендуются по умолчанию, а не являются обязательными, поэтому блокировка файла не препятствует его открытию или удалению, а только повторной блокировке.

...