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

Как упоминалось в jonearles, вы должны написать это в одном выражении SQL.

Если вы настаиваете на использовании PL / SQL: вы слишком много работаете, объявляете переменные, открываете курсоры, зацикливаете, назначаете переменные. Рассмотрим этот PL / SQL:

begin
  for c1 in (select * from tab1@dblink1)
  loop
    for c2 in (Select * from tab2@dblink1 where col1 = c1.col1 and col2 = c1.col2)
    loop
      insert into local.tab3 values (c1.col1,c1.col2,c2.col1,c2.col2);
    end loop;
  end loop;
end;
/
26
задан Seb 27 November 2008 в 07:41
поделиться

5 ответов

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

В Linux, конечно, можно использовать тот же вид техники. Запишите программу, которая вставляет модуль в рабочее ядро. Свяжитесь с модулем и скажите его который дескрипторы закрыться. Будет одинаково опасно сделать так.

2
ответ дан Windows programmer 15 October 2019 в 07:02
поделиться

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

В одной оболочке: кошка

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

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

Теперь Вы говорите gdb выполняться близко (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
76
ответ дан crb 15 October 2019 в 07:02
поделиться

Я сомневаюсь относительно него. Дескрипторы файлов локальны для процесса, stdout 1 ко всем процессам, все же они все еще ссылочные уникальные потоки, конечно.

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

2
ответ дан unwind 15 October 2019 в 07:02
поделиться

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

3
ответ дан Fernando Miguélez 15 October 2019 в 07:02
поделиться

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

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

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

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

2
ответ дан CesarB 15 October 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: