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

StackOverflow https://stackoverflow.com/questions/323146

Вопрос

Вы можете использовать команду 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, является попытка размонтировать файловую систему (любая ссылка на смонтированную файловую систему может заблокировать размонтирование).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top