Pergunta

Eu tenho um projeto que consiste em dois processos e eu preciso passar alguns dados entre eles de forma rápida e eficiente.

Estou ciente de que eu poderia usar soquetes de fazer isso usando TCP, apesar de ambos os processos sempre vai existir no mesmo computador, no entanto, isso não parece ser uma solução muito eficiente.

Eu vejo muita informação sobre o uso de "tubos" no Linux. No entanto eu quero principalmente este para Windows e Linux (de preferência através de uma biblioteca multiplataforma), de preferência em um tipo de seguro, forma não-bloqueio.

Outra coisa importante é que eu preciso para suportar múltiplas instâncias de toda a aplicação (ou seja, ambos os processos), cada um com sua própria cópia independente dos objetos de comunicação.

Além disso, há uma maneira de plataforma cruzada para gerar um novo processo?

Foi útil?

Solução

Para IPC, Windows suporta pipes nomeados apenas como Linux faz , exceto que os nomes de tubos seguem um formato diferente, devido à diferença de formatos de caminho entre os dois sistemas operacionais. Isso é algo que você poderia superar com define pré-processamento simples. Ambos os sistemas operacionais também apoiar IO não-bloqueável em tubos e IO multiplexação com select ().

Outras dicas

Dê uma olhada Boost.Interprocess

Boost.Interprocess simplifica o uso de mecanismos de comunicação e sincronização comum entre processos e oferece uma ampla gama deles:

  • A memória compartilhada.
  • arquivos
  • Memória mapeada.
  • semáforos, exclusões mútuas, variáveis ??de condição e tipos mutex atualizáveis ??para colocá-los na memória compartilhada e arquivos de memória mapeada.
  • versões nomeados desses objetos de sincronização, semelhante ao UNIX / Windows sem_open API / CreateSemaphore.
  • bloqueio de arquivos.
  • ponteiros relativa.
  • filas de mensagens.

Boost.Interprocess mecanismos Interprocess também oferece-nível superior para alocar dinamicamente partes de uma memória compartilhada ou um arquivo de memória mapeada (em geral, para alocar partes de um segmento de memória tamanho fixo). Usando estes mecanismos, ofertas Boost.Interprocess ferramentas úteis para construir C ++ objetos, incluindo STL-como recipientes, na memória compartilhada e arquivos de memória mapeada:

  • Criação dinâmica de anônimos e objetos nomeados em uma memória ou memória compartilhada mapeada arquivo.
  • STL-como recipientes compatíveis com arquivos de memória / mapeados na memória compartilhada.
  • STL-como alocadores prontos para arquivos compartilhados de memória / mapeados na memória execução vários padrões de alocação de memória (como pooling).

Boost.Interprocess foi testado nos seguintes compiladores / plataformas:

  • Visual 7.1 do Windows XP
  • Visual 8.0 do Windows XP
  • GCC 4.1.1 MinGW
  • GCC 3.4.4 Cygwin
  • Intel 9.1 Windows XP
  • GCC 4.1.2 Linux
  • GCC 3.4.3 Solaris 11
  • GCC 4,0 MacOs 10.4.1

Plain velho TCP deve trabalhar bastante eficiente; como eu o entendo, modernos do sistema operacional irá detectar quando ambas as extremidades de uma conexão TCP estão localizados na mesma máquina, e irá internamente rota que os dados através de um rápido, mecanismo leve (pipe-like), em vez de através da pilha TCP comum.

Então, se você já tem o código que funciona através de TCP, eu digo ficar com isso e evitar gastar muito tempo de desenvolvimento extra para não muito recompensa.

Pode ser um exagero, mas você poderia usar o Apache Portable Runtime; aqui são as funções de rosca e de processo.

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