Как закрыть файловый дескриптор из другого процесса в системах unix
-
11-07-2019 - |
Вопрос
Вы можете использовать команду lsof чтобы получить файловые дескрипторы для всех запущенных процессов, но что я хотел бы сделать, так это закрыть некоторые из этих дескрипторов, не находясь внутри этого процесса.Это можно сделать в Windows, так что вы можете легко разблокировать какое-нибудь приложение.
Есть ли какая-нибудь команда или функция для этого?
Решение
В Windows вы можете использовать программу для этого, потому что кто-то написал программу, которая для этого вставляет драйвер устройства в работающее ядро.Кстати, это может быть опасно делать, потому что после закрытия дескриптора, который использовало неработающее приложение, приложение не знает, что дескриптор был закрыт, и когда приложение открывает какой-то другой несвязанный объект, оно не знает, что тот же дескриптор теперь может ссылаться на какой-то другой несвязанный объект.Вы действительно хотите уничтожить неработающее приложение как можно скорее.
В Linux, конечно, вы можете использовать такую же технику.Напишите программу, которая вставляет модуль в работающее ядро.Свяжитесь с модулем и сообщите ему, какие дескрипторы следует закрыть.Делать это будет не менее опасно.
Другие советы
Я не знаю, почему вы пытаетесь это сделать, но вы должны иметь возможность присоединиться к процессу, используя gdb, а затем вызвать close () на fd. Пример: р>
В одной оболочке: кошка
В другой оболочке:
$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
Я так не думаю, но lsof дает вам PID процесса, который открыл файл, так что вы можете полностью убить процесс или, по крайней мере, отправить сигнал, чтобы он завершился.
Я сомневаюсь в этом. Файловые дескрипторы являются локальными для процесса, stdout
равен 1 для всех процессов, но, конечно, они по-прежнему ссылаются на уникальные потоки.
Возможно, было бы полезно более подробно рассказать о проблеме блокировки, которую вы пытаетесь решить.
В Unix это сделать гораздо меньше, чем в Windows.
В Windows большинство программ имеют тенденцию "блокировать" (фактически запрещают совместное использование) открываемых файлов, поэтому они не могут быть прочитаны / записаны / удалены другой программой.
В Unix большую часть времени этого не происходит. Блокировка файлов в Unix в основном носит рекомендательный характер и блокирует только другие попытки блокировки, а не обычные операции чтения / записи / удаления. Вы даже можете удалить текущий каталог процесса.
О единственной ситуации, которая возникает при обычном использовании в Unix, является попытка размонтировать файловую систему (любая ссылка на смонтированную файловую систему может заблокировать размонтирование).