LINUX.ORG.RU

[cannot get working directory]Разъясните


0

0

Создаем директорию, заходим внутрь, не выходя оттуда удаляем её. Как ни странно при запуске того-же sudo идет ругань на «cannot get working directory». Логично. Теперь создадим папку опять, с таким же именем. Почему sudo все-равно продолжает ругаться?

: mkdir wtf
: cd wtf
: rm -rf ~/wtf/
: sudo 
sudo: cannot get working directory
: mkdir ~/wtf
: sudo 
sudo: cannot get working directory

аватарка правильная - одобряю!

megabaks ★★★★
()

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

dreamer ★★★★★
()
Ответ на: комментарий от dreamer

Что-то такое и подозревал.. А где можно про это подробнее почитать на русском? В вики не густо информации, больше ничего и не нашел

ZZaiatSS ★★
() автор топика
Ответ на: комментарий от ZZaiatSS

поясню на примере:

~ :$ps
PID TTY TIME CMD
7332 pts/2 00:00:00 bash

~ :$lsof -n |grep 7332|grep bash
bash 7332 sylvia cwd DIR 8,6 4096 7380993 /home/sylvia
bash 7332 sylvia rtd DIR 8,1 4096 2 /
bash 7332 sylvia txt REG 8,1 598872 16231 /bin/bash
bash 7332 sylvia mem REG 8,1 42464 494863 /lib/libnss_files-2.11.2.so
bash 7332 sylvia mem REG 8,1 34520 494850 /lib/libnss_compat-2.11.2.so
bash 7332 sylvia mem REG 8,5 16968008 6291815 /usr/lib/locale/locale-archive
bash 7332 sylvia mem REG 8,1 1540868 494870 /lib/libc-2.11.2.so
bash 7332 sylvia mem REG 8,1 9668 494852 /lib/libdl-2.11.2.so
bash 7332 sylvia mem REG 8,1 252784 497023 /lib/libncurses.so.5.7
bash 7332 sylvia mem REG 8,1 38484 494855 /lib/libnss_nis-2.11.2.so
bash 7332 sylvia mem REG 8,1 100044 494876 /lib/libnsl-2.11.2.so
bash 7332 sylvia mem REG 8,1 138560 494866 /lib/ld-2.11.2.so
bash 7332 sylvia 0u CHR 136,2 0t0 5 /dev/pts/2
bash 7332 sylvia 1u CHR 136,2 0t0 5 /dev/pts/2
bash 7332 sylvia 2u CHR 136,2 0t0 5 /dev/pts/2
bash 7332 sylvia 255u CHR 136,2 0t0 5 /dev/pts/2

как можно увидеть, процесс имеет 2 открытых дескриптора для каталогов,
rtd ( корневая директория ) и cwd (текущая рабочая директория),
а также загруженные библиотеки и несколько открытых файлов (stdin,stdout,stderr - стандартный ввод-вывод)

если файл (или каталог) удалить, то в Linux дескриптор помечается как удаленный , но не освобождается, пока его использование не будет прекращено всеми программами которые его открыли,
в то же время допустимо создать файл или каталог с тем же именем, новые вызовы fopen() и fopendir() буду открывать новый дескриптор,
но программа должна сделать это сама, bash же один раз открывает cwd (при команде cd) , а дальше будет пытаться делать readdir() , в случае если дескриптор более неверен (но по прежнему открыт!) будет писаться как раз эта ошибка, что unable to get working directory

можно сделать cd .
это переоткроет дескриптор cwd (через fopendir() )

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

Аааа, я почему-то думал что он уникален для каждого каталога.

Вот чего не понимаю: sudo при запуске в убитой директории читает дескриптор и видит что он битый, почему тогда он не может перечитать его опять после пересоздания?

ZZaiatSS ★★
() автор топика
Ответ на: комментарий от ZZaiatSS

> sudo при запуске в убитой директории читает дескриптор и видит что он битый, почему тогда он не может перечитать его опять после пересоздания?

делай cd «$PWD» и не замарачивайся по пустякам.

name_no ★★
()
Ответ на: комментарий от ZZaiatSS

> Дык мне просто интересно почему именно так происходит :)

дескриптор текущей директории наследуется от родительского процеса.

name_no ★★
()
Ответ на: комментарий от ZZaiatSS

> Эээ, а кто выступает родительским процессом при удалении? rm?

Для sudo родительским процессом является bash, из которого ты его запускаешь. Когда ты пишешь sudo<ENTER>, баш запускает внутри себя sudo (можешь считать, что он так хитро форкается для наглядности).

Баш сидит в директории ~/wtf. Ты эту директорию удаляешь, совершенно не важно, каким способом, хоть rsync'ом. Когда баш запускает новый процесс, процесс получает дескриптор текущего каталога, который оказывается инвалидным. Ты видишь соответствующий мессадж.

При чём тут момент удаления? А не при чём, я вообще не понял, что ты хотел спросить.

name_no ★★
()
Ответ на: комментарий от ZZaiatSS

Берешь папку. На ней пишешь «$100», и кладёшь туда 100 баксов. Потом папку сжигаешь. Берешь новую, снова пишешь на ней «$100». И пытаешься достать изнутри 100 бкасов. Получится?

DonkeyHot ★★★★★
()
Ответ на: комментарий от name_no

>процесс получает дескриптор текущего каталога, который оказывается инвалидным

Но после пересоздания папки дескриптор ведь становится валидным, разве нет?

ZZaiatSS ★★
() автор топика
Ответ на: комментарий от DonkeyHot

Я окончательно ничего не понимаю..

ZZaiatSS ★★
() автор топика
Ответ на: комментарий от ZZaiatSS

> Но после пересоздания папки дескриптор ведь становится валидным, разве нет?

тебе уже сказали, что дексриптор ссылается на инод, а не на название. У новой папки инод другой. Инод — это номер.

name_no ★★
()
Ответ на: комментарий от name_no

>дексриптор ссылается на инод, а не на название

Слава Патрику, понял!

тебе уже сказали

Где? Бегло перечитал - не нашел ничего

ZZaiatSS ★★
() автор топика

>Как ни странно при запуске того-же sudo идет ругань на «cannot get working directory»

Судя по твоему внешнему виду тебе сейчас не об этом надо думать

partyzan ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.