Как закрыть дескриптор файла из другого процесса в Unix-системах
Вы можете использовать команду lsof, чтобы получить дескрипторы файлов для всех запущенных процессов, но я хотел бы закрыть некоторые из этих дескрипторов, не будучи внутри этого процесса. Это можно сделать в Windows, поэтому вы можете легко разблокировать какое-либо приложение.
Есть ли для этого какая-либо команда или функция?
Ответы
Ответ 1
В Windows вы можете использовать программу, чтобы сделать это, потому что кто-то написал программу, которая вставляет драйвер устройства в запущенное ядро, чтобы сделать это. Кстати, это может быть опасно, потому что после закрытия дескриптора, используемого сломанным приложением, приложение не знает, что дескриптор был закрыт, и когда приложение открывает какой-то другой несвязанный объект, он не знает что тот же самый дескриптор теперь может ссылаться на какой-то другой несвязанный объект. Вы действительно хотите убить сломанное приложение как можно скорее.
В Linux наверняка вы можете использовать ту же технику. Напишите программу, которая вставляет модуль в запущенное ядро. Общайтесь с модулем и говорите ему, который закрывается. Это будет так же опасно.
Ответ 2
Я не знаю, почему вы пытаетесь это сделать, но вы должны иметь возможность подключиться к процессу с помощью gdb, а затем вызвать close() на fd. Пример:
В одной оболочке: cat
В другой оболочке:
$pidof cat
7213
$gdb -p 7213
...
lots of output
...
(gdb)
Теперь вы скажете gdb выполнить close (0):
(gdb) p close(0)
$1 = 0
(gdb) c
Continuing.
Program exited with code 01.
(gdb)
В первой оболочке я получаю этот вывод:
cat: -: Bad file descriptor
cat: closing standard input: Bad file descriptor
Ответ 3
Я так не думаю, но lsof дает вам PID процесса, который открыл файл, поэтому вы можете полностью уничтожить этот процесс или хотя бы отправить сигнал, чтобы он мог выйти.
Ответ 4
Намного меньше нужно делать это в Unix, чем в Windows.
В Windows большинство программ имеют тенденцию "блокировать" (фактически запретить совместное использование) открываемые файлы, поэтому их нельзя читать/писать/удалять другой программой.
В Unix большую часть времени этого не происходит. Блокировка файлов в Unix в основном консультативная и блокирует другие попытки блокировки, а не обычные операции чтения/записи/удаления. Вы даже можете удалить текущий каталог процесса.
О единственной ситуации, возникающей при обычном использовании в Unix, при попытке umount файловой системы (любая ссылка на смонтированную файловую систему может блокировать umount).
Ответ 5
Я сомневаюсь. Файловые дескрипторы являются локальными процессами, stdout
- 1 для всех процессов, но они все равно ссылаются на уникальные потоки, конечно.
Возможно, более подробная информация будет полезной, о проблеме блокировки, которую вы пытаетесь решить.