Pergunta

Eu nunca escrevi qualquer IPC C ++ no Linux antes.

O meu problema é que eu vou ter vários clientes (escritores), e um único servidor (leitor). Todos estes irão estar na mesma máquina. Os escritores vão entregar blocos de dados (uma string / struct) para o leitor. O leitor irá, em seguida, lê-los em FIFO e fazer algo com eles.

Os tipos de IPC no Linux são ou Pipes ou Sockets / filas de mensagens, tanto quanto eu posso dizer.

Eu só estava me perguntando se alguém poderia me recomendar um caminho para ir para baixo. Estou inclinado para soquetes, mas eu não tenho nenhuma base real para isso. Existe algo que eu deveria ler / entender antes de embarcar nesta viagem?

Graças

Foi útil?

Solução

A principal questão que você deve considerar é que tipo de dados que você está passando como esta vontade, em parte, determinar as suas opções. Isso se resume a saber se os seus dados é limitada ou não. Se não é limitado, em seguida, fluxo de algo orientado como FIFOs ou soquetes são adequados; se for, então você pode fazer melhor uso dos de coisas como MQS ou de memória compartilhada. Desde que você menciona as duas seqüências e estruturas, é difícil dizer o que é apropriado no seu caso, no entanto, se as cordas são delimitadas dentro de algum máximo razoável você pode usar qualquer coisa com algumas pequenas mexer.

O segundo é a velocidade. Nunca há uma resposta completamente correta para isso, mas geralmente é algo como:. Memória compartilhada, MQS, FIFO, soquetes de domínio, sockets de rede

O terceiro é facilidade de uso. Memória compartilhada é o maior PITA desde que você tem que lidar com sua própria sincronização. Pipes são fáceis, desde que os seus comprimentos de mensagens ficar abaixo de tamanho PIPE_BUF. As alças OS maioria de suas dores de cabeça com MQS. Sockets são bastante fáceis, mas você tem o clichê de configuração.

Por último vários dos mecanismos IPC ter tanto POSIX e SYSV variantes. Geralmente POSIX é o caminho a percorrer, a menos que o tipo SYSV tem alguma característica que você realmente precisa ou quer.

EDIT: A resposta de Count0 lembrou-me que você pode estar interessado em algo mais abstrato e nível superior. Além ACE você pode olhar para Poco . E, claro, nenhuma resposta SO está completa se não mencionar Impulsione em algum lugar.

Outras dicas

System V IPC é um pouco complicados para uso mas é um maduro, tecnologia robusta. filas de mensagens, provavelmente, fazer o que quiser e apoiar atômica filas / de-filas.

Sockets são fáceis de usar e também apoiar a comunicação através de uma rede. No entanto, eles não fazem qualquer filas, então você teria que escrever o código de gerenciamento de fila dentro do seu servidor. Usando soquetes com C ++ não é muito diferente de usá-los com C. Há uma abundância de guias para este na net e livros como 'Programação Unix Network (vol 1)' Stevens' que cobre este tópico em alguma profundidade.

Um bom lugar para começar seus pés molhados é este soquetes tutorial .

Em seguida, você precisa de osso-up on tópicos & mutexes e < a href = "http://www.linuxselfhelp.com/HOWTO/C++Programming-HOWTO-18.html" rel = "nofollow noreferrer"> aqui .

Com o acima está tudo pronto para começar a jogar; -)

Embora você não pediu livros, e porque as respostas acima são tão bom, eu só vou sugerir que você chegar em suas mãos cópias desses dois tomos:

Programação Rede UNIX, Volume 2, segunda edição: Interprocess Communications, W. Richard Stevens

Programação Avançada no UNIX Ambiente, segunda edição, W. Richard Stevens e Stephen A. Rago

Há inevitáveis ??ins e outs com este tipo de codificação, estes dois livros irá ajudá-lo através de qualquer confusão que você encontrar.

Tente dar uma olhada ACE (Adaptive Communication Environment) . As bibliotecas da ECA são livres disponíveis, muito maduro e multiplataforma. Infelizmente a documentação boa não é, eu recomendaria este livro para procurar um boa solução. Você pode tentar dar uma olhada este tutorial para obter uma sensação dos padrões (no final do documento). ACE usa um monte de padrões para lidar com muito sucesso e eficiente com esses problemas, especialmente em um contexto de rede, por isso deve ser um bom começo para alcance de bons padrões e métodos de usar.

Especialmente Ace_Task utilizando o Message_Queue permita fazer o que você precisa.

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