C: функция удаления удаляет все файлы? - PullRequest
2 голосов
/ 01 февраля 2010

Я использую что-то вроде этого:

char *file;
file = (char *)malloc(BUFSIZE * sizeof(char));
printf("Enter the filename:");
scanf("%s", file);
if(remove(file)) {
   printf("Error while removing");
}

Я создал два файла:

touch filetobedeleted1.txt
chmod 777 filetobedeleted1.txt

touch filetobedeleted2.txt
chmod 444 filetobedeleted2.txt

Теперь моя программа удаляет оба файла, но это не должно произойти, верно? Кто-нибудь знает, что не так с кодом?

РЕДАКТИРОВАТЬ: Добавлен код для ввода имени в файл ...

Хорошо ... похоже, все зависит от разрешений, установленных для каталога, но есть ли способ использовать разрешения для файлов в качестве проверки?

Ответы [ 4 ]

3 голосов
/ 01 февраля 2010

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

(Если в каталоге установлен липкий бит, то вы также должны быть владельцем файла - /tmp использует это).

3 голосов
/ 01 февраля 2010

Для удаления файла необходим только доступ на запись в каталог.

Строго говоря, вы удаляете ссылку на файл, жесткую ссылку. Сам файл не будет удален до тех пор, пока не исчезнут все ссылки на файл.

Попробуйте с помощью команды rm!

1 голос
/ 01 февраля 2010

Вы можете использовать функцию getumask() и проверить ее перед вызовом remove().

1 голос
/ 01 февраля 2010

remove() вызывает unlink(), и, согласно man 2 unlink, для этого нужны только разрешения на запись в каталог parent .

...