2016-09-26 7 views
2

Я использую GNU/Linux уже более 10 лет, поэтому считаю себя довольно знакомым с разрешениями на файлы.c program: Почему remove() удаляет файл без разрешения на запись

Чтобы проверить следующий код, я использовал 'chmod -w' в 'undo_path'. Затем я подтвердил, что файл не имеет разрешений на запись, используя ls -al. Он показал:

-r - R - r-- 1 Andy Andy 52 26 сентября 18:17 lastrmw

Затем я попробовал код. Дважды. Оба раза команда remove() была успешной.

if (remove (undo_path)) 
{ 
    fprintf (stderr, "Warning: failed to remove %s\n", undo_path); 
    perror (__func__); 
} 

Как удалить файл без разрешения на запись?

Я использую Debian 8/Jessie, и мое ядро: Linux OCEANUS 3.16.0-4-amd64 # 1 SMP Debian 3.16.36-1 + deb8u1 (2016-09-03) x86_64 GNU/Linux

+1

Разрешения для файлов относятся к * содержимому * файла. –

+0

Но подумайте еще раз: есть ли, возможно, какой-то другой файл, имя которого, собственно, является частью содержимого? –

+0

Спасибо, @KerrekSB, я вижу, когда я использую rm в файле, я получаю приглашение удалить его до его удаления. Забавно, что раньше я этого не осознавал. – andy5995

ответ

2

Функция remove - это операция в каталоге, которая удаляет из нее запись. Он не удаляет файл, если только он не создает условия, при которых файл автоматически удаляется файловой системой. Если, например, тот же файл имеет две соответствующие записи в каталоге или открыт процессом, он не будет удален.

2

remove() работает в каталогах, поэтому он не будет работать, только если у вас нет права на запись для папки, а не файла.

1

Удаление файла означает удаление записи . Удаление (а также создание) записи в каталоге влияет на блоки содержащихся в нем директорий, в то время как блоки, используемые удаляемым файлом, не затрагиваются. Фактически, блоки файлов могут быть даже не освобождены, если имеется несколько ссылок на файл (жесткие ссылки). Поэтому он содержит разрешения на запись в каталоге, которые отмечены, а не файлы.

 Смежные вопросы

  • Нет связанных вопросов^_^