Как закрыть файловый дескриптор из другого процесса в системах unix

вы можете использовать команду lsof чтобы получить файловые дескрипторы для всех запущенных процессов, но я хотел бы закрыть некоторые из этих дескрипторов, не находясь внутри этого процесса. Это можно сделать на Windows, так что вы можете легко разблокировать некоторые приложения.

есть ли команда или функция для этого?

5 ответов


в Windows вы можете использовать программу для этого, потому что кто-то написал программу, которая вставляет драйвер устройства в работающее ядро. Кстати, это может быть опасно, потому что после закрытия дескриптора, который использовал сломанное приложение, приложение не знает, что дескриптор был закрыт, и когда приложение открывает какой-то другой несвязанный объект, оно не знает, что тот же дескриптор может теперь ссылаться на какой-то другой несвязанный объект. Ты действительно хочешь убить сломленного. применение как можно скорее.

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


Я не знаю, почему вы пытаетесь это сделать, но вы должны иметь возможность подключиться к процессу с помощью gdb, а затем вызвать close() на fd. Пример:

в одной оболочке: cat

в другой оболочке:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

Теперь вы говорите gdb выполнить close (0):

(gdb) p close(0)

 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

в первой оболочке я получаю этот вывод:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor

Я так не думаю, но lsof дает вам PID процесса, который открыл файл, поэтому вы можете полностью убить процесс или, по крайней мере, отправить сигнал, чтобы он вышел.


существует гораздо меньше необходимости делать это в Unix, чем в Windows.

в Windows большинство программ имеют тенденцию "блокировать" (фактически запрещать общий доступ) файлы, которые они открывают, поэтому они не могут быть прочитаны/записаны/удалены другой программой.

в Unix большую часть времени этого не происходит. Блокировка файлов в Unix в основном является консультативной и блокирует только другие попытки блокировки, а не обычные операции чтения/записи/удаления. Вы даже можете удалить текущий каталог процесс.

о единственной ситуации, которая возникает при обычном использовании в Unix, - это попытка umount файловой системы (любая ссылка на смонтированную файловую систему может заблокировать umount).


сомневаюсь. Файловые дескрипторы являются process-local,stdout равно 1 для всех процессов, но они по-прежнему ссылаются на уникальные потоки, конечно.

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