Eu tenho um pequeno problema com um dos meus projetos.
Tenho tentado encontrar um exemplo bem documentado de uso de memória compartilhada, fork()
mas sem sucesso.
Basicamente, o cenário é que quando o usuário inicia o programa, eu preciso armazenar dois valores na memória compartilhada: current_path que é um char * e um file_name que também é char * .
Dependendo dos argumentos do comando, um novo processo é iniciado fork()
e esse processo precisa ler e modificar a variável current_path armazenada na memória compartilhada enquanto a variável file_name é somente leitura.
Existe um bom tutorial sobre memória compartilhada com código de exemplo (se possível) que você pode me indicar?
c
linux
fork
shared-memory
bleepzter
fonte
fonte
shmget()
et al. e também ammap()
abordagem pura comMAP_ANON
(akaMAP_ANONYMOUS
) - emboraMAP_ANON
não seja definida pelo POSIX. Há também POSIXshm_open()
eshm_close()
para gerenciar objetos de memória compartilhada. [... continuou ...]shm_unlink()
), enquanto os mecanismos que usammmap()
requerem um arquivo eMAP_SHARED
persistir os dados (eMAP_ANON
impede a persistência). Há um exemplo completo na seção Racional da especificação deshm_open()
.Respostas:
Existem duas abordagens:
shmget
emmap
. Vou falar sobremmap
, já que é mais moderno e flexível, mas você pode dar uma olhadaman shmget
( ou neste tutorial ) se preferir usar as ferramentas de estilo antigo.A
mmap()
função pode ser usada para alocar buffers de memória com parâmetros altamente personalizáveis para controlar o acesso e as permissões, e para apoiá-los com o armazenamento do sistema de arquivos, se necessário.A função a seguir cria um buffer na memória que um processo pode compartilhar com seus filhos:
A seguir está um programa de exemplo que usa a função definida acima para alocar um buffer. O processo pai escreverá uma mensagem, bifurcará e então aguardará que seu filho modifique o buffer. Ambos os processos podem ler e gravar na memória compartilhada.
fonte
shmget
é uma maneira realmente antiquada, e alguns diriam obsoleta, de fazer memória compartilhada ... Melhor usarmmap
eshm_open
, arquivos simples ou simplesmenteMAP_ANONYMOUS
.Aqui está um exemplo de memória compartilhada:
Passos :
Use ftok para converter um nome de caminho e um identificador de projeto em uma chave IPC do System V
Use shmget que aloca um segmento de memória compartilhada
Use shmat para anexar o segmento de memória compartilhada identificado por shmid ao espaço de endereço do processo de chamada
Faça as operações na área de memória
Desanexar usando shmdt
fonte
Isso inclui o uso de memória compartilhada
fonte
experimente este exemplo de código, eu testei, fonte: http://www.makelinux.net/alp/035
fonte
shmget
e ashmat
partir de um processo diferente), que é o ponto principal da memória compartilhada ... = (Aqui está um exemplo de mmap:
fonte
open
adiciona sobrecarga de E / S de arquivo. Use em seushm_open
lugar.