Pergunta

Estou procurando sugestões sobre possíveis mecanismos de IPC que sejam:

  • Plataforma cruzada (Win32 e Linux pelo menos)
  • Simples de implementar em C++ assim como o linguagens de script mais comuns (perl, ruby, python, etc).
  • Finalmente, simples de usar do ponto de vista da programação!

Quais são minhas opções?Estou programando no Linux, mas gostaria que o que escrevo fosse portável para outros sistemas operacionais no futuro.Pensei em usar soquetes, pipes nomeados ou algo como DBus.

Foi útil?

Solução

Em termos de velocidade, o melhor mecanismo IPC multiplataforma serão os tubos.Isso pressupõe, entretanto, que você deseja IPC multiplataforma na mesma máquina.Se você quiser conversar com processos em máquinas remotas, você vai querer usar soquetes.Felizmente, se você estiver falando pelo menos sobre TCP, soquetes e pipes se comportam praticamente da mesma maneira.Embora as APIs para configurá-los e conectá-los sejam diferentes, ambas agem apenas como fluxos de dados.

O difícil, porém, não é o canal de comunicação, mas sim as mensagens que você passa por ele.Você realmente deseja ver algo que realizará verificação e análise para você.Eu recomendo dar uma olhada no Google Buffers de protocolo.Basicamente, você cria um arquivo de especificação que descreve o objeto que deseja passar entre os processos, e há um compilador que gera código em várias linguagens diferentes para ler e escrever objetos que correspondem à especificação.É muito mais fácil (e menos propenso a erros) do que tentar criar um protocolo de mensagens e analisá-lo você mesmo.

Outras dicas

Para C++, confira Aumentar o IPC.
Provavelmente você também pode criar ou encontrar algumas ligações para as linguagens de script.

Caso contrário, se for realmente importante poder interagir com linguagens de script, sua melhor aposta é simplesmente usar arquivos, pipes ou soquetes ou até mesmo uma abstração de nível superior como HTTP.

Por que não o D-Bus?É um sistema de passagem de mensagens muito simples que funciona em quase todas as plataformas e foi projetado para ser robusto.É suportado por praticamente todas as linguagens de script neste momento.

http://freedesktop.org/wiki/Software/dbus

Você pode querer tentar YAMI , é muito simples, mas funcional, portátil e vem com ligação para alguns idiomas

Se você deseja um dispositivo portátil, fácil de usar, multilíngue e LGPLsolução ed, eu recomendo que você ZeroMQ:

  • Incrivelmente rápido, escalonável quase linearmente e ainda assim simples.
  • Adequado para sistemas/arquiteturas simples e complexos.
  • Padrões de comunicação muito poderosos disponíveis:REP-REP, PUSH-PULL, PUB-SUB, PAIR-PAIR.
  • Você pode configurar o protocolo de transporte para torná-lo mais eficiente se estiver passando mensagens entre threads (inproc://), processos (ipc://) ou máquinas ({tcp|pgm|epgm}://), com uma opção inteligente para eliminar parte da sobrecarga do protocolo no caso de conexões em execução entre máquinas virtuais VMware (vmci://).

Para serialização eu sugeriria Pacote de mensagens ou Protocol Buffers (que outros já mencionaram), dependendo de suas necessidades.

Que tal Economia do Facebook?

Thrift é uma estrutura de software para desenvolvimento escalonável de serviços em várias linguagens.Ele combina uma pilha de software com um mecanismo de geração de código para construir serviços que funcionam de forma eficiente e integrada entre C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk e OCaml.

Acho que você vai querer algo baseado em soquetes.

Se você quiser RPC em vez de apenas IPC, sugiro algo como XML-RPC/SOAP, que roda em HTTP e pode ser usado em qualquer linguagem.

YAMI – Mais uma infraestrutura de mensagens é uma estrutura leve de mensagens e rede.

Se você estiver disposto a tentar algo um pouco diferente, existe o GELO plataforma de ZeroC.É de código aberto e é compatível com praticamente todos os sistemas operacionais que você possa imaginar, além de ter suporte a linguagens para C++, C#, Java, Ruby, Python e PHP.Finalmente, é muito fácil de conduzir (os mapeamentos de idiomas são adaptados para se adaptarem naturalmente a cada idioma).Também é rápido e eficiente.Existe até uma versão reduzida para dispositivos.

Posso sugerir que você use o plibsys Biblioteca C.É muito simples, leve e multiplataforma.Lançado sob a LGPL.Ele fornece:

  • regiões nomeadas de memória compartilhada em todo o sistema (implementações System V, POSIX e Windows);
  • semáforos nomeados em todo o sistema para sincronização de acesso (implementações System V, POSIX e Windows);
  • implementação de buffer compartilhado em todo o sistema com base na memória compartilhada e semáforo;
  • soquetes (TCP, UDP, SCTP) com suporte IPv4 e IPv6 (implementações UNIX e Windows).

É uma biblioteca fácil de usar com uma documentação muito boa.Como está escrito em C, você pode facilmente fazer ligações a partir de linguagens de script.

Se você precisar passar grandes conjuntos de dados entre processos (especialmente se a velocidade for essencial), é melhor usar memória compartilhada para passar os próprios dados e soquetes para notificar um processo de que os dados estão prontos.Você pode fazer isso da seguinte maneira:

  • um processo coloca os dados em um segmento de memória compartilhada e envia uma notificação através de um soquete para outro processo;como uma notificação geralmente é muito pequena, a sobrecarga de tempo é mínima;
  • outro processo recebe a notificação e lê os dados do segmento de memória compartilhada;depois disso, ele envia uma notificação de que os dados foram lidos para o primeiro processo para que ele possa alimentar mais dados.

Esta abordagem pode ser implementada de forma multiplataforma.

A computação distribuída geralmente é complexa e é aconselhável usar bibliotecas ou estruturas existentes em vez de reinventar a roda.O postador anterior já enumerou algumas dessas bibliotecas e estruturas.Dependendo de suas necessidades, você pode escolher uma estrutura de nível muito baixo (como soquetes) ou de alto nível (como CORBA).Não pode haver uma resposta genérica do tipo "use isto".Você precisa se educar sobre programação distribuída e então achará muito mais fácil escolher a biblioteca ou estrutura certa para o trabalho.

Existe uma estrutura C++ amplamente usada para computação distribuída chamada ACE e CORBA ORB TAO (que é construída sobre ACE).Existem livros muito bons sobre ACE http://www.cs.wustl.edu/~schmidt/ACE/ então você pode dar uma olhada.Tomar cuidado!

Não existe nada mais simples do que usar pipes, que são suportados em todos os sistemas operacionais que conheço e podem ser acessados ​​em praticamente todos os idiomas.

Confira esse tutorial.

Soquetes TCP para localhost FTW.

Python tem uma biblioteca IPC muito boa:ver https://docs.python.org/2/library/ipc.html

Xojo possui suporte IPC multiplataforma integrado com seu Classe IPCSocket.Embora você obviamente não possa "implementá-lo" em outros idiomas, você pode usá-lo em um aplicativo de console Xojo e chamá-lo de outros idiomas, tornando esta opção talvez muito simples para você.

Os protobufs do Google são uma péssima ideia, pois você deseja um código fácil de manter e depurar.é muito fácil para as pessoas abusarem dele e usá-lo para poluir seu código.os arquivos proto são legais, mas são basicamente a mesma coisa que um arquivo de cabeçalho de estrutura, e o código que ele gera é uma porcaria completa, fazendo você se perguntar se é realmente uma ferramenta de ataque secreta para sabotar projetos de software em vez de automatizá-los.Depois de usá-lo por um tempo, é quase impossível removê-lo do seu código.é melhor usar apenas um arquivo de cabeçalho de estruturas de formato fixo que são facilmente depuradas.

se você realmente precisa de compactação, mude para um mapeamento de endereço/dados de estruturas de arquivamento remotamente ...então os pacotes são apenas um pacote de pares de endereços/dados...também uma estrutura que é muito fácil de automatizar com seus próprios scripts perl que produzem código legível e depurável por humanos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top