Обмен технологиями

Межпроцессное взаимодействие — каналы

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Вставьте сюда описание изображения

1. Введение в процесс коммуникации

1.1 Зачем нужна связь между процессами

Требуется взаимодействие между процессами. Например, все уровни управления в школе взаимосвязаны и не могут управляться вертикально. Именно потому, что процессы должны сотрудничать. Предпосылкой для сотрудничества является то, что процессы должны взаимодействовать. Некоторые данные готовы к уведомлению, некоторые данные являются просто передаваемыми данными, а некоторые относятся к данным, связанным с управлением.

Факт: процессы независимы, процесс = структура данных ядра, код и данные процесса.

Цель процесса коммуникации:

  • Передача данных: один процесс должен отправить свои данные другому процессу.
  • Совместное использование ресурсов: совместное использование одних и тех же ресурсов между несколькими процессами.
  • Событие уведомления: процессу необходимо отправить сообщение другому процессу или группе процессов, чтобы уведомить его (их) о том, что произошло определенное событие (например, уведомление родительского процесса о завершении процесса).
  • Управление процессом: некоторые процессы надеются полностью контролировать выполнение другого процесса (например, процесса отладки). В это время процесс управления надеется перехватить все ловушки и исключения другого процесса и иметь возможность узнавать об изменениях его состояния во времени.

1.2 Как процессы взаимодействуют

Стоимость связи между процессами может быть немного выше: процессы независимы, и любые ресурсы, открытые одним процессом, не видны другому процессу. Когда мы раньше говорили о родительско-дочернем процессе, данные родительского процесса были унаследованы дочерним процессом. Это не относится к связи. Они могут быть унаследованы, но не всегда наследуются. Существует разница между возможностью передачи информации. и всегда иметь возможность передавать информацию.

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

  1. Должно быть, определенный процесс должен сначала взаимодействовать и позволить ОС создать общий ресурс.
  2. ОС должна предоставлять множество системных вызовов, чтобы позволить процессам обращаться за системными ресурсами через системные вызовы.
    Различные общие ресурсы, созданные ОС, и разные интерфейсы системных вызовов определяют разные типы межпроцессного взаимодействия.

Вставьте сюда описание изображения

2. Трубопровод

2.1 Анонимный конвейер

2.1.1 Конвейер понимания файловых дескрипторов

Вставьте сюда описание изображения

Конвейер по сути представляет собой файл уровня памяти, который не нужно сбрасывать на диск.
Во-первых, родительский процесс дважды открывает файл в режиме чтения и записи. Причина двойного открытия файла состоит в том, чтобы получить два объекта структурного файла, чтобы для файла было два указателя чтения и записи, чтобы можно было выполнять операции чтения и записи. используйте независимые указатели. Таким образом, чтение и запись не будут влиять друг на друга.Указатель чтения-записи записывает текущую позицию чтения или записи файла.struct file В файле есть только один указатель чтения-записи. При записи (или чтении) в файл указатель чтения-записи будет перемещаться, а затем снова читать (записывать). В это время указатель чтения-записи больше не существует. в исходном положении и не может прочитать только что написанное содержимое, поэтому нужно открывать один и тот же файл дважды разными способами. Затем создайте дочерний процесс. Дочерний процесс унаследует файл, открытый в родительском процессе, то есть унаследует таблицу дескрипторов файлов родительского процесса. В это время родительский и дочерний процессы будут использовать один и тот же файловый ресурс. процесс может передать в файл файловый дескриптор № 4. При записи в файл родительский процесс может читать из файла через файловый дескриптор № 3. В это время родительский и дочерний процессы осуществляют передачу данных, то есть связь. . Родительский и дочерний процессы видят один и тот же буфер памяти, который мы здесь называем файлом канала. Трубы допускают только одностороннюю связь из-за простоты.

Почему родительско-дочерние процессы печатают данные на один и тот же терминал монитора?
Поскольку соответствующий дочерний процесс унаследует таблицу файловых дескрипторов, соответствующую родительскому процессу, а затем укажет на тот же файл, это означает, что родительский процесс введет файл, а дочерний процесс также введет файл, и то же самое будет записано в буфере, операционная система будет записана на тот же монитор.


По умолчанию в процессе открываются три стандартного ввода и стандартного вывода: 0, 1, 2... Как открыть 0, 1, 2 по умолчанию?
Все команды естьbashдочерний процесс, покаbashКогда он включен, все дочерние процессы включены по умолчанию.


Почему дочерний процесс активно закрывается (0/1/2), не влияя на дальнейшее использование файла монитора родительским процессом?
подсчет ссылок на уровне памяти--, когда счетчик ссылок на уровне памяти уменьшается до 0, ресурсы файла освобождаются.


Родительско-дочерний процесс закрывает ненужные файловые дескрипторы, зачем их раньше нужно было открывать?
Чтобы позволить дочернему процессу наследовать. Его не обязательно закрывать, но рекомендуется закрыть, чтобы предотвратить случайное запись.


Почему трубы односторонние?
Этот метод прост, снижает затраты на разработку и обеспечивает только одностороннюю связь. Любой файл обновляется в буфере, а затем данные обновляются в файле. Этот процесс является односторонним.
Простые трубы, которые мы видим в жизни, все односторонние, например водопроводные, с одним входом и одним выходом, что соответствует характеристикам трубопроводов.

2.1.2 Использование интерфейса

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

int pipe(int pipefd[2]);