Как вы можете отправить данные в другой процесс (только на уровне языка C ++) - PullRequest
0 голосов
/ 02 мая 2019

Предположим, вы разрабатываете два приложения (A и B).

Как вы можете отправить некоторую информацию в B из A , если вам разрешено работать только на уровне языка c ++ (включая стандартные библиотеки и STL)?

Теперь я думаю, что std :: ofstream и std :: ifstream могут быть возможным решением (хотя и грубым)? - но какие подводные камни есть и можно ли их избежать? (Как?).

1 Ответ

3 голосов
/ 02 мая 2019

Вы просто не можете. Стандарт C ++ 17 не знает ни о каком виде межпроцессного взаимодействия и не знает много о процессах (за исключением std::system, поведение которого на самом деле не указано). Некоторые операционные системы не имеют никаких процессов, а некоторые из них не имеют файлов, а некоторые из них не имеют каналов.

Узнайте больше об операционных системах. Я настоятельно рекомендую Операционные системы: три штуки (которые доступны бесплатно).

Конечно, вы можете читать и записывать файл, но синхронизация между этими двумя процессами все же должна произойти (возможно, запускает один за другим, в некоторой специфической операционной системе, так что запуск A затем B, и как именно это происходит, зависит от ОС)

Прочитайте этот стандарт C ++ 17 (например, черновик здесь ) для проверки.

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

Я рекомендую быть прагматичным и использовать некоторые фреймворки, такие как Boost , Qt , ZeroMQ или POCO (или старые сокеты Беркли ), которые имеют дело с процессами и средствами межпроцессного взаимодействия ; вы, вероятно, найдете платформу, поддерживающую несколько операционных систем, которые вас действительно волнуют (AFAIK, все Boost, POCO, Qt знают о Linux, Windows, MacOSX и предлагают общий API, абстрагирующий их; но вы можете найти некоторую академическую операционную систему, которая несовместимо с ними; на практике любой платформы, ориентированной как на Windows, так и на POSIX, должно быть достаточно).

С некоторым любопытством вы можете найти ОС с хорошей реализацией C ++ 17, которая имеет очень странный API (посмотрите в GNU Hurd для примера).

Если ваше средство IPC основано на байтовых потоках, посмотрите текстовые протоколы (возможно, JSONRPC , SOAP, HTTP, ...). Их легче кодировать, и большинство из них поставляется с некоторой C ++-совместимой библиотекой ...

А благодаря нескольким месяцам работы и большому количеству ноу-хау вы можете даже портировать недавний GCC или Clang на большинство других операционных систем: они стараются разумно абстрагировать требования к ОС.

Помните, вы можете найти операционные системы, которые даже не имеют файловой системы : посмотрите на CapROS или Contiki для недавнего примера, а также посмотрите внутри tunes.org , где были заархивированы интересные дискуссии, связанные с вашей темой, в прошлом веке. Но с некоторой болью (я думаю, что это несколько месяцев работы для эксперта GCC или Clang), вы сможете портировать недавний GCC или Clang , чтобы настроить его на получение кросс-компилятор C ++ 17, предназначенный для них.

IMHO, стандартная библиотека C ++, которая позволяет «открывать» только один «файл» (предположительно с именем THEFILE), соответствует букве стандарта C ++ 17. AFAIK, у вас нет гарантии , что std::ifstream или std::ofstream успешно работает.

Кстати, современные процессоры являются практически многоядерными, поэтому имеет смысл попытаться запустить A и B параллельно и выполнить некоторый IPC (специфичным для ОС способом, возможно, абстрагированным какой-то платформой или библиотекой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...