Сравнение Unix/Linux IPC

Ошибка анализа: синтаксическая ошибка, неожиданная '['

Эта ошибка возникает в двух вариантах:

Вариант 1

$arr = [1, 2, 3];

Синтаксис инициализатора этого массива был введен только в PHP 5.4; это приведет к возникновению ошибки парсера в версиях до этого. Если возможно, обновите свою установку или используйте старый синтаксис:

$arr = array(1, 2, 3);

См. Также этот пример из руководства.

Вариант 2

$suffix = explode(',', 'foo,bar')[1];

Результаты функции разыменования массива также были введены в PHP 5.4. Если обновление невозможно, вам нужно использовать временную переменную:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

См. Также этот пример из руководства.

76
задан tshepang 23 June 2015 в 09:47
поделиться

4 ответа

Unix IPC

Здесь является большими семью:

  1. Канал

    Полезный только среди процессов, связанных как родитель/ребенок. Звоните pipe(2) и fork(2) . Однонаправленный.

  2. FIFO или именованный канал

    Два несвязанных процесса могут использовать FIFO в отличие от простого канала. Звоните mkfifo(3) . Однонаправленный.

  3. Сокет и Сокет Домена Unix

    Двунаправленный. Предназначенный для сетевой связи, но может использоваться локально также. Может использоваться для различного протокола. Нет никакой границы сообщения для TCP. Звоните socket(2) .

  4. Очередь сообщений

    ОС поддерживает дискретное сообщение. См. sys/msg.h.

  5. Сигнал Сигнала

    отправляет целое число в другой процесс. Не сцепляется хорошо с мультипотоками. Звоните kill(2) .

  6. Семафор

    механизм синхронизации А для много процессов или потоков, подобных очереди людей, ожидающих ванной. См. sys/sem.h.

  7. Общая память

    Делают Ваше собственное управление совместным выполнением. Звоните shmget(2) .

сообщение Граничный выпуск

Одним определяющим фактором при выборе одного метода по другому является граничная проблема сообщения. Можно ожидать, что "сообщения" будут дискретны друг от друга, но это не для потоков байтов как TCP или Канал.

Рассматривают пару клиента и сервера эха. Клиент отправляет строку, сервер получает ее и отправляет ее назад. Предположим, что клиент отправляет "Привет", "Привет", и "Как насчет ответа?".

С протоколами потока байтов, сервер может получить как "Ад", "oHelloHow", и "об ответе?"; или более реалистично "HelloHelloHow об ответе?". Сервер не имеет никакой подсказки, где граница сообщения.

возраст старый прием должен ограничить длину сообщения до CHAR_MAX или UINT_MAX и согласиться отправить длину сообщения сначала в char или uint. Так, если Вы в стороне получения, необходимо считать длину сообщения сначала. Это также подразумевает, что только один поток должен делать сообщение, читающее за один раз.

С дискретными протоколами как UDP или очереди сообщений, Вы не должны волноваться об этой проблеме, но программно потоки байтов легче иметь дело с тем, потому что они ведут себя как файлы и stdin/out.

95
ответ дан 8 revs, 2 users 85% 24 November 2019 в 11:19
поделиться

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

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

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

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

16
ответ дан Judge Maygarden 24 November 2019 в 11:19
поделиться

Стоит отметить, что много библиотек реализует один тип вещи сверху другого.

Общая память не должна использовать ужасные sysv функции общей памяти - это намного более изящно для использования mmap () (mmap файл в на tmpfs/dev/shm, если Вы хотите названный; mmap/dev/zero, если Вы хотите разветвленный не exec'd процессы наследовать его анонимно). Однако это все еще оставляет Ваши процессы с некоторой потребностью в синхронизации для предотвращения проблем - обычно при помощи некоторых из других механизмов IPC, чтобы сделать синхронизацию доступа к области общей памяти.

8
ответ дан MarkR 24 November 2019 в 11:19
поделиться

Вот веб-страница с простым тестом: https://sites.google.com/site/rikkus/sysv-ipc-vs-unix-pipes-vs-unix- сокеты

Насколько я могу судить, каждый из них имеет свои преимущества:

  • Канальный ввод-вывод является самым быстрым, но для работы требуются отношения родитель / потомок.
  • Sysv IPC имеет определенную границу сообщений и может подключать разрозненные соединения. процессы локально.
  • Сокеты UNIX могут локально подключать разнородные процессы и имеют более высокую пропускную способность, но нет внутренних границ сообщений.
  • Сокеты TCP / IP могут подключать любые процессы, даже по сети, но имеют более высокие накладные расходы и никаких внутренних границ сообщений.
10
ответ дан 24 November 2019 в 11:19
поделиться
Другие вопросы по тегам:

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