Unix IPC
Вот большая семерка:
труба
Полезно только среди процессов, связанных как родитель / потомок. Звоните pipe(2)
и fork(2)
. Однонаправленный.
FIFO или именованная труба
Два несвязанных процесса могут использовать FIFO в отличие от простой трубы. Звоните mkfifo(3)
. Однонаправленный.
Сокет и Unix Domain Socket
двунаправленная. Предназначен для сетевого общения, но может использоваться и локально. Может быть использован для другого протокола. Там нет границы сообщения для TCP. Звоните socket(2)
.
Очередь сообщений
ОС поддерживает дискретное сообщение. См. sys / msg.h .
Сигнал
Сигнал отправляет целое число в другой процесс. Не очень хорошо сочетается с многопоточностью. Звоните kill(2)
.
Семафор
Механизм синхронизации для нескольких процессов или потоков, похожий на очередь людей, ожидающих ванную. См. sys / sem.h .
Общая память
Выполните свой собственный контроль параллелизма. Звоните shmget(2)
.
Сообщение Граничная проблема
Одним из определяющих факторов при выборе одного метода над другим является проблема границы сообщения. Вы можете ожидать, что «сообщения» будут отдельными друг от друга, но это не относится к потокам байтов, таким как TCP или Pipe.
Рассмотрим пару эхо-клиента и сервера. Клиент отправляет строку, сервер получает ее и отправляет обратно. Предположим, клиент отправляет «Hello», «Hello» и «Как насчет ответа?».
При использовании протоколов байтовых потоков сервер может получать сообщения «Hell», «oHelloHow» и «about answer?»; или более реалистично "HelloHello, как насчет ответа?" Сервер не имеет ни малейшего представления, где находится граница сообщения.
Старая хитрость заключается в том, чтобы ограничить длину сообщения CHAR_MAX
или UINT_MAX
и согласиться сначала отправить длину сообщения в char
или uint
. Таким образом, если вы находитесь на принимающей стороне, вы должны сначала прочитать длину сообщения. Это также подразумевает, что только один поток должен одновременно выполнять чтение сообщений.
С дискретными протоколами, такими как UDP или очереди сообщений, вам не нужно беспокоиться об этой проблеме, но программно потоки байтов легче решать, поскольку они ведут себя как файлы и stdin / out.