Я пытаюсь понять, почему это дизайнерское решение было принято с помощью системного вызова rename () в 4.2BSD. Здесь я ничего не пытаюсь решить, просто поймите причину самого поведения.
4.2BSD представил системный вызов rename () с целью разрешить атомарное переименование / перемещение файлов. Из 4.3BSD-Reno / src / sys / ufs / ufs_vnops.c:
/*
* If ".." must be changed (ie the directory gets a new
* parent) then the source directory must not be in the
* directory heirarchy above the target, as this would
* orphan everything below the source directory. Also
* the user must have write permission in the source so
* as to be able to change "..". We must repeat the call
* to namei, as the parent directory is unlocked by the
* call to checkpath().
*/
if (oldparent != dp->i_number)
newparent = dp->i_number;
if (doingdirectory && newparent) {
VOP_LOCK(fndp->ni_vp);
error = ufs_access(fndp->ni_vp, VWRITE, tndp->ni_cred);
VOP_UNLOCK(fndp->ni_vp);
Так ясно, что эта проверка была добавлена намеренно. Мой вопрос - почему? Это поведение должно быть интуитивно понятным?
В результате этого нельзя перемещать каталог (расположенный в каталоге, который можно записать), который нельзя записать в другой каталог, в который можно записать атомарно. Однако вы можете создать новый каталог, переместить ссылки (при условии, что у вас есть доступ для чтения к каталогу), а затем удалить свой бит записи в каталоге. Вы просто не можете сделать это атомарно.
% cd /tmp
% mkdir stackoverflow-question
% cd stackoverflow-question
% mkdir directory-1
% mkdir directory-2
% mkdir directory-1/directory-i-cant-write
% echo "foo" > directory-1/directory-i-cant-write/contents
% chmod 000 directory-1/directory-i-cant-write/contents
% chmod 000 directory-1/directory-i-cant-write
% mv directory-1/directory-i-cant-write directory-2
mv: rename directory-1/directory-i-cant-write to directory-2/directory-i-cant-write: Permission denied
Теперь у нас есть каталог, который я не могу написать с содержимым, которое я не могу прочитать, что я не могу двигаться атомарно. Однако я могу добиться того же эффекта не атомарно, изменив разрешения, создав новый каталог, используя ln для создания новых ссылок и изменив разрешения. (Оставлено как упражнение для читателя)
. и ... уже в специальном корпусе, поэтому я не особо согласен с тем, что интуитивно понятно, что если я не могу написать каталог, я не могу "изменить ...", что и предполагает источник. Есть ли какая-то причина для этого, кроме того, что автор кода воспринимает правильное поведение? Может ли случиться что-то плохое, если мы позволим людям атомарно перемещать каталоги (которые они не могут писать) между каталогами, которые они могут писать?