Este projeto demonstra diferentes mecanismos de Inter-Process Communication (IPC) em sistemas Unix/Linux, incluindo Pipes Anônimos, Sockets Locais e Memória Compartilhada. O sistema possui um backend em C++ e um frontend em Python com interface gráfica.
projeto-ipc/
├── src/
│ ├── backend/ # Implementações em C dos mecanismos IPC
│ │ ├── common/ # Código compartilhado (JSON output)
│ │ ├── pipes/ # Demonstração de pipes anônimos
│ │ ├── sockets/ # Demonstração de sockets locais
│ │ └── shared_memory/ # Demonstração de memória compartilhada
│ └── frontend/ # Interface gráfica em Python
│ ├── gui/ # Componentes da interface
│ └── backend_comm/ # Comunicação com o backend
├── tests/ # Testes unitários e de integração
├── build/ # Arquivos compilados (gerado)
├── CMakeLists.txt # Configuração do CMake
└── build.sh # Script de build automatizado
- Pipes Anônimos (
pipe_demo): Comunicação bidirecional entre processo pai e filho - Sockets Locais (
socket_demo): Comunicação cliente-servidor via Unix domain sockets - Memória Compartilhada (
shm_demo): Compartilhamento de dados entre processos com sincronização via semáforos - JSON Output (
json_output): Sistema de logging estruturado para integração com frontend
- Interface Gráfica: Aplicação Tkinter com abas para cada mecanismo IPC
- Gerenciador de Processos: Execução e monitoramento dos executáveis do backend
- Parser JSON: Interpretação das mensagens estruturadas do backend
- Linux/Unix (testado em WSL2)
- GCC (versão 7.0 ou superior)
- CMake (versão 3.10 ou superior)
- Make
- Python 3.7+
- Tkinter (geralmente incluído com Python)
# Dar permissão de execução ao script
chmod +x build.sh
# Executar build completo
./build.sh# 1. Criar diretório de build
mkdir -p build
cd build
# 2. Configurar com CMake
cmake ..
# 3. Compilar
make -j$(nproc)
# 4. Executar testes
ctest
# 5. Voltar ao diretório raiz
cd ..# Executar a aplicação principal
python3 src/frontend/main.py# Pipes
./build/pipe_demo "Sua mensagem aqui"
# Sockets
./build/socket_demo "Sua mensagem aqui"
# Memória Compartilhada
./build/shm_demo "Sua mensagem aqui"O backend utiliza um formato JSON padronizado para todas as mensagens:
{
"type": "status",
"module": "nome_do_modulo",
"status": "tipo_status",
"message": "descrição_detalhada",
"pid": 12345,
"timestamp": 1703123456
}{
"type": "data",
"module": "nome_do_modulo",
"data": "conteúdo_dos_dados",
"source": "origem_dos_dados",
"pid": 12345,
"timestamp": 1703123456
}{
"type": "error",
"module": "nome_do_modulo",
"message": "descrição_do_erro",
"pid": 12345,
"timestamp": 1703123456
}- Funcionamento: Cria dois pipes para comunicação bidirecional
- Processo: Pai envia mensagem → Filho recebe e ecoa → Pai recebe eco
- Saída: Logs de criação, comunicação e finalização
- Funcionamento: Servidor aguarda conexão, cliente envia dados
- Processo: Servidor aceita conexão → Cliente envia mensagem → Servidor ecoa
- Saída: Logs de conexão, recebimento e resposta
- Funcionamento: Segmento de memória compartilhado com sincronização via semáforos
- Processo: Pai escreve → Libera semáforo → Filho lê → Limpa recursos
- Saída: Logs de criação, escrita, sincronização e leitura
# Testes do backend
cd build && ctest && cd ..
# Testes do frontend
python tests/frontend_tests/integration.py# Teste de memória compartilhada
./build/shm_test
# Teste de JSON output
./build/json_output_test
# Teste de pipes
./build/pipe_test
# Teste de sockets
./build/socket_test- Aba Pipes: Demonstração interativa de pipes anônimos
- Aba Sockets: Teste de comunicação via sockets locais
- Aba Shared Memory: Experimentação com memória compartilhada
- Logs em Tempo Real: Visualização das mensagens JSON do backend
- Controles Interativos: Campos de entrada e botões para cada teste
- Logging Estruturado: Todas as operações são registradas em JSON
- Tratamento de Erros: Captura e reporta erros de forma consistente
- Sincronização: Uso apropriado de semáforos e wait() para coordenação
- Limpeza de Recursos: Liberação adequada de memória e descritores
# Verificar se o build foi executado
ls -la build/
# Recompilar se necessário
./build.sh# Verificar se o arquivo de socket já existe
ls -la /tmp/ipc_socket
# Remover manualmente se necessário
rm -f /tmp/ipc_socket# Dar permissão de execução
chmod +x build.sh
chmod +x build/*
# Verificar permissões do diretório
ls -la build/- Todas as operações são logadas em JSON no stdout
- Use
2>&1para capturar erros junto com a saída normal - Verifique os logs do frontend para mensagens de erro
libc(padrão)librt(para shared memory e semáforos)libpthread(para operações de processo)
tkinter(interface gráfica)subprocess(execução de processos)json(parsing de mensagens)osesys(operações do sistema)
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
- Enzo Capellari - Desenvolvimento e planejamento - zocacc