Как закрыть дескриптор файла из другого процесса в 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 для всех процессов, но они все равно ссылаются на уникальные потоки, конечно.

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