LINUX.ORG.RU
решено ФорумAdmin

cwd

 , ,


0

0

Как можно сделать, чтобы процесс не имел открытого дескриптора текущей рабочей директории?


Вопрос звучит странно. Как вы определили, что у процесса есть этот самый дескриптор? Или вы смотрите на cwd в выводе lsof?

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

Ну да, по lsof тоже. Тут что-то не так? Ещё я флешку не могу отмонтировать, пока терминал открыт в директории на флешке.

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

Открытый дескриптор возникает только если процесс специально делать системный вызов open(″.″, ...), а рабочий каталог существует независимо и меняется вызовом chdir(). И нельзя, чтобы у процесса не было рабочего каталога, можно только сделать его другим, допустим ″/″.

Но и закрытие дескрипторов и смена рабочего каталога должно быть вызвано самим процессом. Конечно, можно, трассировать процесс и выполнить от его имени любые системные вызовы, но «очнувшись» процесс может сильно «удивиться», что рабочий каталог другой.

На ваш страх и риск:

echo -e 'call chdir("/")\ndetach\nquit' |\
gdb -n -pid PID -batch -x /dev/stdin
Откуда вызывать этот скрипт и как определять PID процессов, занимающих флешку, пишите сами.

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

Но и закрытие дескрипторов и смена рабочего каталога должно быть вызвано самим процессом.

А можно сразу порождать его по уму, чтобы он их просто не унаследовал?

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

А можно сразу порождать его по уму, чтобы он их просто не унаследовал?

Можно O_CLOEXEC ставить на каждый открытый дескриптор. Если в какой-то использоемуей тобой либе её афтар так не сделал, то жопа. По хорошему это должно быть дефолтное поведение, но получилось как обычно.

На линухе можно нрахаться с /proc/self/fd.

anonymous
()

Удаляй директорию после запуска процесса. Нет директории - нет дескриптора.

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

Удаляй директорию после запуска процесса. Нет директории - нет дескриптора.

Чушь. Дескриптор существует пока он открыт, тут не винда, удалить открытое — можно, но освобождение произойдёт при закрытии или автоматически при завершении процесса.

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

Извините за долгое молчание, как-то позабыл про эту тему. Хочу вернуться.

Открытый дескриптор возникает только если процесс специально делать системный вызов open(″.″, …)

Мой эксперимент противоречит этому утверждению. Я написал простейшую программу лишь с пустым вечным циклом и запустил её(через exec из shell’а) в директории на флешке. Я вижу через lsof, что процесс программы держит cwd дескриптор и вижу что флешка не может отмонтироваться(target is busy).

Вот я и думаю, как можно сказать ядру, чтобы оно создавало cwd дескриптор лишь при необходимости.

urquan
() автор топика
Последнее исправление: urquan (всего исправлений: 2)
Ответ на: комментарий от urquan

Чтобы не было проблем с отмонтированием, адекватно написанные демоны при старте меняют свою рабочую директорию на /. Тебе уже сверху об этом писали.

Deleted
()
Ответ на: комментарий от urquan

Ещё я флешку не могу отмонтировать, пока терминал открыт в директории на флешке.

Закрыть терминал в директории на флешке, или сменить в нем каталог — совсем не вариант?

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

Я не знаю, что вы там видите в выводе lsof, вы эту инфу скрваете. И, похоже, не пытались осмыслить, что я писал. Если в выводе lsof в поле FD (четвёртый столбец) стоит запись cwd, то это не открытый файловый дескриптор. Не нужно называть текущий рабочий каталог файловым дескриптором, это разные сущности на уровне ядра.

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

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