Linux закрыть открытый файл

Закрыть файлы lsof

Такой вопрос. Можно ли закрыть некоторые файлы, которые отображает lsof, не останавливая процесс, который их открыл, и как это сделать?

Конечно. Цепляешься к процессу отладчиком, вызываешь close() на нужные дескриптопы, отцепляешься.

Отладчиком пользоваться не приходилось. Можно тут подробнее?

$ gdb -p 1234 (gdb) call close(100) 

интересная тема. На stackoverflow пишут чтобы избежать ошибки unknown return type добавлять возвращаемый тип (gdb) call (int)close(3)

у меня gdb выдает для процесса evince с открытым pdf 5 lwp. Я их пробовал закрывать ничего не вышло с возвратом -1. Наоборот при повторном коннекте еще один добавился

не хаос, а ж с глюками…
это необходимый этап познания…

90% софта выплюнет ошибку и упадёт.

Где ты был два часа назад с этим комментарием?

А что, это было не очевидно? errno типа EBADFD/EBADF — это писец который не игнорируют.

Я думал ты прикалываешься.

Возможно переоткрыть /dev/null вместо файла — более гуманный вариант если в файл только пишут.

Я не программист, поэтому твой ответ мне не понятен. И задача у меня — освободить ресурсы.

Ты закрыл файловый дескриптор через который программа работала с файлом. Любое последующее действие с этим файловым дескриптором вызывает ошибку и она неисправимая. Действие программы на такую ошибку — аварийно завершиться.

Обрати внимание, что большая часть демонов/серверов обычно умеет переоткрывать часть своих рабочих файлов как раз для того, чтобы этими файлами можно было что-то безопасно сделать.

Если не секрет, что за программа и что за файл ты хотел от нее оторвать?

Нет, задача у тебя так и не озвучена. Озвучено что попало, показавшееся тебе направлением решения.

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

Например, у процесса утек файловый дескриптор, он забыл его закрыть, а файл так и остался открытым…

Когда я писал тебе ответ, я был полностью уверен, что у тебя именно такой случай.

Если же ты закрыл рабочие дескрипторы, то… КАК вообще в голову могла прийти мысль закрыть дескрипторы, с которыми работает процесс.

Читайте также:  Linux ошибка проверки файловых систем

Похожие темы

  • Форум lsof (2006)
  • Форум странное поведение lsof (2008)
  • Форум Проблемы c lsof (2018)
  • Форум утилита lsof (2022)
  • Форум не фильтрует lsof -d ^mem /dev/sda2 (2016)
  • Форум не понял вывод lsof -i6 (2023)
  • Новости Восстановление удалённых файлов с помощью lsof (2006)
  • Форум gentoo lsof (2012)
  • Форум lsof, а дальше? (2006)
  • Форум Как правильно закрыть контейнер dm-crypt (2018)

Источник

4.4.2. Открытие и закрытие файлов

Новые дескрипторы файлов получают (наряду с другими источниками) в результате системного вызова open(). Этот системный вызов открывает файл для чтения или записи и возвращает новый дескриптор файла для последующих операций с этим файлом. Мы видели объявление раньше:

int open(const char *pathname, int flags, mode_t mode);

Строка С, представляющая имя открываемого файла.

Поразрядное ИЛИ с одной или более констант, определенных в . Вскоре мы их рассмотрим.

Режимы доступа для создаваемого файла. Это обсуждается далее в главе, см. раздел 4.6 «Создание файлов». При открытии существующего файла опустите этот параметр[46].

Возвращаемое open() значение является либо новым дескриптором файла, либо -1, означающим ошибку, в этом случае будет установлена errno. Для простого ввода/вывода аргумент flags должен быть одним из значений из табл. 4.3.

Таблица 4.3. Значения flags для open()

Именованная константа Значение Комментарий O_RDONLY 0 Открыть файл только для чтения, запись невозможны O_WRONLY 1 Открыть файл только для записи, чтение невозможно O_RDWR 2 Открыть файл для чтения и записи

Вскоре мы увидим пример кода. Дополнительные значения flags описаны в разделе 4.6 «Создание файлов». Большой объем ранее написанного кода Unix не использовал эти символические значения. Вместо этого использовались числовые значения. Сегодня это рассматривается как плохая практика, но мы представляем эти значения, чтобы вы их распознали, если встретитесь с ними

Системный вызов close() закрывает файл: его элемент в системной таблице дескрипторов файлов помечается как неиспользуемый, и с этим дескриптором нельзя производить никаких дальнейших действий. Объявление следующее:

В случае успеха возвращается 0, при ошибке (-1). При возникновении ошибки нельзя ничего сделать, кроме сообщения о ней. Ошибки при закрытии файлов являются необычными, но не невозможными, особенно для файлов, доступ к которым осуществляется через сеть. Поэтому хорошей практикой является проверка возвращаемого значения, особенно для файлов, открытых для записи.

Если вы будете игнорировать возвращаемое значение, специально приведите его к типу void, чтобы указать, что вам не нужен результат:

Читайте также:  Install vbox addition linux

(void)close(fd); /* отказ от возвращаемого значения */

Легкомысленность этого совета в том, что слишком большое количество приведений к void имеют тенденцию загромождать код. Например, несмотря на принцип «всегда проверять возвращаемое значение», чрезвычайно редко можно увидеть код, проверяющий возвращаемое значение printf() или приводящий его к void. Как и со многими аспектами программирования на С, здесь также требуются опыт и рассудительность.

Как упоминалось, число открытых файлов, если оно большое, ограничивается, и вам всегда следует закрывать файлы, когда работа с ними закончена. Если вы этого не сделаете, то в конечном счете выйдете за пределы лимита дескрипторов файлов, создав ситуацию, которая ведет к потере устойчивости части вашей программы.

Система закрывает все открытые файлы, когда процесс завершается, но — за исключением 0, 1 и 2 — плохая манера полагаться на это.

Когда open() возвращает новый дескриптор файла, она всегда возвращает наименьшее неиспользуемое целое значение. Всегда. Поэтому, если открыты дескрипторы файлов 0–6 и программа закрывает дескриптор файла 5, следующий вызов open() вернет 5, а не 7. Это поведение важно; далее в книге мы увидим, как оно используется для аккуратной реализации многих важных особенностей Unix, таких, как перенаправление ввода/вывода и конвейеризация (piping)

Читайте также

4.4.2.2. Закрытие всех открытых файлов

4.4.2.2. Закрытие всех открытых файлов Открытые файлы наследуются порожденными процессами от своих родительских процессов. Фактически они являются общими. В частности, общим является положение в файле. Подробности мы оставим для дальнейшего обсуждения в разделе 9.1.1.2

11.2.2. Закрытие файлов

11.2.2. Закрытие файлов Одной из операций, которые одинаковы для файлов всех типов, является закрытие файла. Ниже показано, как закрыть файл.#include <unistd.h>int close(int fd);Очевидно, что это базовая операция. Однако есть один важный момент, касающийся закрытия файлов, о котором

11.2.3. Открытие файлов в файловой системе

11.2.3. Открытие файлов в файловой системе Хотя Linux предусматривает множество типов файлов, обычные файлы используются наиболее часто. Программы, конфигурационные файлы, файлы данных — все они подпадают под это определение, и многие приложения не могут (явно) использовать

12.5. Повторное открытие журнальных файлов

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

Закрытие открытых файлов

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

Читайте также:  Linux file sharing clients

10.1.1. Открытие и закрытие файлов

10.1.1. Открытие и закрытие файлов Метод класса File.new, создающий новый объект File, также открывает файл. Первым параметром, естественно, является имя файла.Необязательный второй параметр называется строкой указания режимам он говорит, как нужно открывать файл — для чтения,

Высокоуровневое открытие файлов

Высокоуровневое открытие файлов Функции открытия потока возвращают указатель на тип FILE (этот указатель называют также указателем потока), этот указатель используется при дальнейших обращениях к

Открытие файлов

Открытие файлов Файл должен быть открыт функциями open, sopen или creat до выполнения первой операции ввода или вывода с использованием функций нижнего уровня для этого файла.Файл может быть открыт для чтения, записи, или для чтения и записи, может быть открыт в текстовом или в

Закрытие файлов

Закрытие файлов Функция close закрывает открытые файлы. Открытые файлы также автоматически закрываются при неаварийном завершении

Открытие файлов по умолчанию

Открытие файлов по умолчанию Стоит обратить особое внимание на класс Process. С помощью данного класса очень удобно запускать любой файл, который будет открываться программой, сопоставленной с данным типом файла. Предположим, что необходимо воспроизвести музыкальный файл

Открытие и создание файлов

Открытие и создание файлов После создания объекта класса CFile можно открыть файл, вызвав метод Open. Методу Open надо указать путь к открываемому файлу и режим его использования. Прототип метода Open имеет следующий вид:virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);В качестве

Закрытие файлов

Закрытие файлов После того, как вы поработали с файлом, его надо закрыть. Класс CFile имеет для этого специальный метод Close:virtual void Close() throw(CFileException);Метод закрывает файл. Если вы создали объект класса CFile и открыли файл, а затем объект удаляется, то связанный с ним файл

8.3.3 Открытие Файлов

8.3.3 Открытие Файлов Точные детали того, как открываются и закрываются файлы, различаются в разных операционных системах и здесь подробно не описываются. Поскольку после включения «stream.h» станвятся доступны cin, cout и cerr, во многих (если не во всех) программах не нужно держать

4.5.1. Открытие и закрытие приложения Dashboard

4.5.1. Открытие и закрытие приложения Dashboard Для открытия/скрытия рабочей области приложения Dashboard используется клавиша <F12>, при условии, что умолчания не изменены. Также вы можете нажать на пиктограмму, расположенную на панели Dock: Поверхность рабочего стола потемнеет, а

Источник

Оцените статью
Adblock
detector