Завершает ли завершение процесса все файлы, открытые этим процессом?

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

Это Парадигма Unix, но она не всегда верна в Linux (и хотя я не знаком с оригинальной Unix, я сомневаюсь, что это было правдой даже там).

В мире Linux (в отличие от Windows), помимо хранилища файлов, файловая система также используется для обмена данными ввода-вывода.

Не совсем. Например, анонимный канал не имеет файловой системы, и даже с именованным каналом данные сами не проходят через файловую систему.

Таким образом, драйвер устройства для любого соответствующего аппаратного устройства фактически заполняет данные в таких файлах (скажем, / dev / sd *)

Он не заполняет файлы, он просто выполняет чтение / запись / ioctl в специальный файл. Файловая система никогда не видит этих операций.

Когда вы говорите: «Все является файлом или процессом», это подход к выполнению операций ввода-вывода с использованием файла в ядре Linux (или UNIX)?

В некотором роде. Парадигма состоит в том, что вместо отдельных функций для чтения и записи с диска он должен реализовывать файловый интерфейс, чтобы вы могли передавать диск в программы, которые могут обрабатывать файлы. Так, например, вы можете hexdump содержимое диска, даже если hexdump , вероятно, не имеет кода, специфичного для работы с дисками.

2
03.01.2017, 05:23
2 ответа

«Все дескрипторы файлов, потоки каталогов, дескрипторы преобразования и дескрипторы каталога сообщений, открытые в вызывающем процессе, должны быть закрыты». Это то, что, по словам POSIX, должно произойти, если процесс завершается из-за сигнала (т. Е. "Убивая его").

Таким образом, клиент, процесс, обращающийся к серверу, обязательно закроет свой конец сетевого соединения. Поведение сервера («база данных») при прекращении работы клиента («ваш процесс») остается на усмотрение сервера (обнаруживать и действовать).

Сетевое соединение определенно будет закрыто на стороне клиента, но что сервер делает с сеансом в этом случае, трудно сказать. Если у него есть блокировка таблицы или строки в таблице, когда она должна быть снята?

MySQL имеет тайм-аут холостого сеанса, после которого он снимает блокировки, удерживаемые исчезающим клиентом (см. этот вопрос StackOverflow ]). Вам нужно будет заглянуть в документацию для конкретной базы данных, которую вы используете, чтобы увидеть, что может произойти, но я предполагаю, что в большинстве случаев будет задействован какой-то таймер простоя.

7
27.01.2020, 21:51

да, но ...

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

1
27.01.2020, 21:51

Теги

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