Открытый дескриптор возникает только если процесс специально делать системный вызов open(″.″, ...), а рабочий каталог существует независимо и меняется вызовом chdir(). И нельзя, чтобы у процесса не было рабочего каталога, можно только сделать его другим, допустим ″/″.
Но и закрытие дескрипторов и смена рабочего каталога должно быть вызвано самим процессом. Конечно, можно, трассировать процесс и выполнить от его имени любые системные вызовы, но «очнувшись» процесс может сильно «удивиться», что рабочий каталог другой.
А можно сразу порождать его по уму, чтобы он их просто не унаследовал?
Можно O_CLOEXEC ставить на каждый открытый дескриптор. Если в какой-то использоемуей тобой либе её афтар так не сделал, то жопа. По хорошему это должно быть дефолтное поведение, но получилось как обычно.
Удаляй директорию после запуска процесса. Нет директории - нет дескриптора.
Чушь. Дескриптор существует пока он открыт, тут не винда, удалить открытое — можно, но освобождение произойдёт при закрытии или автоматически при завершении процесса.
Извините за долгое молчание, как-то позабыл про эту тему. Хочу вернуться.
Открытый дескриптор возникает только если процесс специально делать системный вызов open(″.″, …)
Мой эксперимент противоречит этому утверждению. Я написал простейшую программу лишь с пустым вечным циклом и запустил её(через exec из shell’а) в директории на флешке. Я вижу через lsof, что процесс программы держит cwd дескриптор и вижу что флешка не может отмонтироваться(target is busy).
Вот я и думаю, как можно сказать ядру, чтобы оно создавало cwd дескриптор лишь при необходимости.
Я не знаю, что вы там видите в выводе lsof, вы эту инфу скрваете. И, похоже, не пытались осмыслить, что я писал. Если в выводе lsof в поле FD (четвёртый столбец) стоит запись cwd, то это не открытый файловый дескриптор. Не нужно называть текущий рабочий каталог файловым дескриптором, это разные сущности на уровне ядра.
Если речь идёт именно о текущем рабочем каталоге, то написа в топике про файловый дескриптор, вы спровоцировали его замусоривание ненужным вам O_CLOEXEC.