Estou portando um aplicativo de console que foi escrito em C visando Linux. Quero tornar o código o mais portátil possível, para que ele também possa ser usado no Windows e outros sistemas operacionais. Até agora, consegui substituir todo o código específico do Linux, como pthreads, semáforos e operações de sistema de arquivos, com cabeçalhos stdlib C++ correspondentes.
Um dos recursos que o aplicativo tem é executar como arquitetura cliente-servidor, para permitir cálculos em segundo plano e persistir e reutilizar o estado quando o cliente CLI sai. Eu li sobre vários métodos IPC, como sockets, pipes e memória compartilhada, mas eles sempre usam syscalls não portáveis.
Existe alguma maneira de fazer isso usando apenas C++ e stdlib? A única solução que consigo pensar é a comunicação baseada em arquivo, mas parece muito difícil manter a atomicidade, especialmente com vários clientes, e o servidor tem que pesquisar o arquivo para alterações, pois todos os métodos de notificação parecem ser específicos do SO também. A última pergunta no Stackoverflow sobre isso tem 15 anos, então talvez algo tenha sido proposto para resolver isso em C++23 e posteriores.
Atualmente, a linguagem C++ por si só (incluindo a biblioteca padrão) não suporta nenhum mecanismo IPC.
Além disso, a linguagem nem sequer tem a noção de processo (threads foram adicionados no C++11, mas não processos).
Sua única opção é alguma API/biblioteca.
Algumas opções viáveis:
Se você puder usar o boost (que é considerado bastante portátil), há 2 módulos relevantes:
(1)
Boost.Interprocess
- contém muitos blocos de construção para IPC, como objetos de sincronização, memória compartilhada etc.(2)
Boost.Asio
- uma biblioteca para rede e E/S de baixo nível, que tem bom suporte para soquetes .Se você não puder usar o boost, poderá usar a API mais ou menos padrão para sockets, suportada por muitos sistemas operacionais comuns (com funções como
bind
,send
, etc.).Uma observação (pessoal):
Claro que pode variar dependendo dos requisitos do sistema, etc., mas descobri que sockets são geralmente uma boa abordagem padrão. Eles são relativamente fáceis de gerenciar, suportados na maioria dos sistemas, têm desempenho razoável e permitem que você escale facilmente para várias máquinas.
Não, até onde eu sei, nada relacionado ao IPC foi incluído nos novos padrões C++.
No entanto, para tais casos, você pode usar o pré-processador para escrever código específico da plataforma. Isso também torna seu código independente da plataforma, pois o código específico da plataforma é então usado apenas no respectivo sistema.