2012-04-18 1 views
0

Я пытаюсь предсказать, какие файлы я могу удалить, используя unlink().Когда у вас есть разрешение на использование unlink()?

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

Есть ли другие случаи? Я пытаюсь объяснить, как эти файлы могут быть удалены моей программой (программа не работает как root или в группе администратора).

drwxrwxr-x 4 root admin 136 Apr 17 23:53 . 
drwxrwxr-x 7 root admin 238 Jan 27 11:49 .. 
-rwxrwxr-x 1 root admin 560 Jan 27 11:49 info.nib 
-rwxrwxr-x 1 root admin 18399 Jan 27 11:49 keyedobjects.nib 

Спасибо!

+1

Подсказка: функция называется 'unlink', а не' delete' по какой-то причине .. :-) –

+0

В одном из каталогов-предков есть расширенный индикатор атрибутов «@» (это OSX Lion). Означает ли это что-нибудь? – emrosenf

ответ

1

Как уже упоминалось, каталог должен быть доступен для записи эффективным пользователем. Тем не менее, файл может иметь расширенные разрешения (ACL), применяемые к нему, что предотвращает его удаление. Из примера, который вы показываете, я думаю, вы используете Mac OS, верно? Там вы можете использовать ls -le для отображения ACL. chmod(1) manpage рассказывает о различных разрешениях. Если вы хотите запросить ACL в своей программе, вам, вероятно, следует начать с чтения acl(3) manpage.

+0

Я считаю, что это правильный ответ, но когда я пытаюсь получить acl файлов: 'acl_t acl = acl_get_file (путь, ACL_TYPE_EXTENDED);', я получаю errno 'EINVAL'. – emrosenf

+0

Кроме того, я перебирал каталоги предков с помощью 'ls -l -a [email protected]; cd ..', и лучшее, что я мог бы почерпнуть, это то, что в одном из каталогов-предков есть атрибут' com.apple.FinderInfo'. Я все еще не могу понять, как это поможет мне определить, является ли файл в каталоге непримиримым. – emrosenf

3

На самом деле, это разрешения что касается вопроса!

0

каталог он находится в должен иметь +w

1

Еще один случай, когда другой процесс все еще имеет файл, который вы хотите удалить, открыт. От человека странице unlink

EBUSY

Имя файла не может быть несвязанными, так как он используется системой или другим процессом; например, это точка монтирования или клиентское программное обеспечение NFS создало его для представления активного, но в противном случае безымянный индексный дескриптор («NFS глупо переименован»).

Также отметим, что эффективный идентификатор процесса должен иметь доступ на запись в каталог, содержащий путь файла, который вы хотите разъединить.

+0

Здесь у вас есть точка для того, чтобы быть первым местом, которое я нашел, почему я получал EBUSY при открытии обычного файла и не использовал O_EXCL. –

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