#include <IPC++/mensageiro.H>
Mostrar lista completa dos membros
Membros públicos | |
Mensageiro (key_t const chave=getuid()) | |
Contrói um novo mensageiro. | |
~Mensageiro () | |
Destrói o mensageiro, destruindo a caixa do correio criada se for o último mensageiro em existência. | |
std::string | meuIdentificador () const |
Devolve um identificador único para o processo, que consiste no nome do utilizador seguido do número do processo. | |
std::string | identificadorDoOutro () const |
Devolve o identificador único do outro processo, com o qual o corrente está emparelhado através do mensageiro. | |
void | leMensagem () |
Lê uma nova mensagem vinda do "outro". | |
template<typename Tipo> Tipo const | mensagemLida () const |
Devolve a mensagem lida na forma de um valor do tipo Tipo. | |
template<typename Tipo> void | envia (Tipo &mensagem) const |
Envia uma mensagem correspondente a um valor do tipo Tipo (versão para variáveis). | |
template<typename Tipo> void | envia (Tipo const &mensagem) const |
Envia uma mensagem correspondente a um valor do tipo Tipo (versão para constantes e valores temporários). | |
template<typename Char> void | envia (Char *&mensagem) const |
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para ponteiros simples). | |
template<typename Char> void | envia (Char const *&mensagem) const |
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para ponteiros para caracteres constantes). | |
template<typename Char> void | envia (Char *const &mensagem) const |
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para ponteiros constantes). | |
template<typename Char> void | envia (Char const *const &mensagem) const |
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para ponteiros constantes para caracteres constantes). | |
template<typename Char, int dimensao> void | envia (Char const(&mensagem)[dimensao]) const |
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para matrizes de caracteres). |
Esta classe é um solitão! A ideia é que um processo com uma instância desta classe fica em comunicação com outro com outra instância da mesma classe. A selecção do outro processo é feita automaticamente, de acordo com as disponibilidades. A ideia é permitir a comunicação entre dois processos do mesmo jogo, sendo que os jogadores não têm controlo sobre que será o seu opositor.
Nas descrições usa-se o termo "eu" para indicar o processo corrente, e "outro" para indicar o processo a que o "eu" está emparelhado pelo mensageiro.
A comunicação faz-se enviando e recebendo mensagens. As mensagens enviadas e recebidas são de qualquer tipo para o qual:
Não existe, para já, nenhuma forma de indagar se há alguma mensagem disponível para ser recebida e muito menos saber o seu tipo. O protocolo entre os processos é que tem de garantir que os processos recebem tantas mensagens quantas as enviadas pelo outro, enviam tantas mensagens quantas as recebidas pelo outro, e que as mensagens enviadas e recebidas têm tipos compatíveis.
A classe é simples de usar. Por exemplo, suponha que se pretendia fazer um pequeno jogo em que ganha quem gerar um número aleatório maior. Poder-se-ia escrever o seguinte programa:
#include <iostream> #include <cstdlib> #include <ctime> #include <IPC++/mensageiro.H> using namespace std; using namespace IPC; int main() { // Se não se fizer isto os jogadores geram sempre o mesmo número // aleatório... srand(time(0)); try { // Construir mensageiro: Mensageiro mensageiro; // Escrever identificações: cout << "Eu sou o " << mensageiro.meuIdentificador() << endl; cout << "Ele é o " << mensageiro.identificadorDoOutro() << endl; // Gerar número aleatório: int meu = rand(); // Enviá-lo ao adversário: mensageiro.envia(meu); // Receber número do adeversário: mensageiro.leMensagem(); int dele = mensageiro.mensagemLida<int>(); // Verificar resultado: if(meu < dele) cout << "Perdi " << meu << " contra " << dele << "..." << endl; else if(meu > dele) cout << "Ganhei " << meu << " contra " << dele << '!' << endl; else cout << "Empatámos " << meu << " a " << dele << '.' << endl; } catch(IPC::Erro& erro) { cerr << string(erro) << endl; } }
Definido na linha 89 do ficheiro mensageiro.H.
|
Contrói um novo mensageiro. Podem-se criar mensageiros de dois tipos: restritos ou não restritos. O primeiro tipo consegue-se não passando qualquer argumento ao construtor e restringe o emparelhamento dos processos a processos do mesmo utilizador. O segundo tipo é mais geral, pois permite o emparelhamento de processos de utilizadores arbitrários da mesma máquina, mas exige a passagem de uma chave ipc que deve ser única para cada tipo de aplicação prevista (por uma questão de compatibilidade de protocolos de comunicação).
Definido na linha 11 do ficheiro mensageiro.C. |
|
Destrói o mensageiro, destruindo a caixa do correio criada se for o último mensageiro em existência.
Definido na linha 76 do ficheiro mensageiro.C. |
|
Devolve um identificador único para o processo, que consiste no nome do utilizador seguido do número do processo.
Definido na linha 26 do ficheiro mensageiro_impl.H. |
|
Devolve o identificador único do outro processo, com o qual o corrente está emparelhado através do mensageiro.
Definido na linha 34 do ficheiro mensageiro_impl.H. |
|
Lê uma nova mensagem vinda do "outro". Espera pela mensagem a ler se não estiver nenhuma mensagem disponível.
Definido na linha 42 do ficheiro mensageiro_impl.H. |
|
Devolve a mensagem lida na forma de um valor do tipo Tipo. É um erro se o tipo indicado não corresponder ao tipo do valor enviado pelo "outro".
Definido na linha 49 do ficheiro mensageiro_impl.H. |
|
Envia uma mensagem correspondente a um valor do tipo Tipo (versão para variáveis).
Definido na linha 77 do ficheiro mensageiro_impl.H. Referenciado por envia(). |
|
Envia uma mensagem correspondente a um valor do tipo Tipo (versão para constantes e valores temporários).
Definido na linha 90 do ficheiro mensageiro_impl.H. |
|
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para ponteiros simples).
Definido na linha 121 do ficheiro mensageiro_impl.H. Referências envia(). |
|
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para ponteiros para caracteres constantes).
Definido na linha 103 do ficheiro mensageiro_impl.H. Referências envia(). |
|
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para ponteiros constantes).
|
|
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para ponteiros constantes para caracteres constantes).
Definido na linha 109 do ficheiro mensageiro_impl.H. Referências envia(). |
|
Envia uma mensagem correspondente a um valor do tipo cadeia clássica de caracteres (versão para matrizes de caracteres).
Definido na linha 128 do ficheiro mensageiro_impl.H. Referências envia(). |