.::IPC::SHM::. :Introdução: Agora, nessa parte do tutorial, ensinarei algo um tanto quanto mais complicado, mas ao mesmo tempo útil. Chama-se Shared Memory, uma puta forma de você compartilhar um tiquim de memória entre dois programas para eles transferirem dados entre si. Esse tutorial de IPC::SHM é mais uma adaptação do trecho de shared memory do Dave C (http://www.cs.cf.ac.uk/Dave/C/), doque algo meu. :Acessando um segmento de memória compartilhada: [prot header: sys/shm.h] int shmget(key_t key, size_t size, int shmflg); [/prot] Essa função serve para adiquitir acesso a determinado segmento de memória que está sendo compartilhado. A variável key contém a ID desse suposto segmento de memória, size é o tamanho do segmento requerido, e sgmflg é o argumento de criação e acesso ao segmento. Em caso de erro, retorna -1. :Controlando um segmento: [prot header: sys/shm.h] int shmctl(int shmid, int cmd, struct shmid_ds *buf); [/prot] Essa função serve para controlar segmentos de memória compartilhada. A variável shmid é o retorn de shmget praticamente, cmd é o comando de controle, quie só podem ser estes: SHM_LOCK // Tranca esse segmento, que eu saiba, deve-se ser UID 0 para poder fazer algo desse tipo SHM_UNLOCK // Inverso do anterior, mas necessita ainda ser UID 0 IPC_STAT // Adquire o status desse segmento, ele retorna o status para a variável de buffer struct shmid_ds *buf IPC_SET // Seta as permissões de acesso do segmento IPC_RMID // Remove esse segmento Em caso de erro, retorna -1. :Fixando e desfixando algo do segmento: [prot header: default_shm] void *shmat(int shmid, const void *shmaddr, int shmflg); int shmdt(const void *shmaddr); [/prot] Fixa e "desfixa" algo, nenhum segredo :P, qualquer coisa, manda mail para mim com a dúvida, mas é que acho que a esse ponto vocês já entendem essas funcs. :Exemplo final para melhor entendimento de Shared Memory: [code shm_serv.c] #include #include #include #include #include #include int main() { int id, a; key_t k; char *seg, *s; k = 1234; // Cria o segmento 1234 id = shmget(k, 27, IPC_CREAT | 0666); /* 0666 é a permissão, como em um chmod dando permissão a algum arquivo */ if(id == -1) { perror("shmget()"); exit(1); } seg = shmat(id, NULL, 0); // Joga no segmento a var seg if(seg == (char*)-1) { perror("shmat()"); exit(1); } // Agora vou jogar a string no segmento :) s = seg; for(a = 'a'; a <= 'z'; a++) *s++ = a; *s = NULL; /* Agora vou rodar um loop para esperar um sinal que avisará que o cliente viu tudo e já desligou :)*/ while(*seg != ':') sleep(1); return 0; } [/code] [code shm_clt.c] [includes :shm_srv.c] int main() { int id; key_t k; char *seg, *s; k = 1234; id = shmget(k, 27, 0666); if(id == -1) { perror("shmget()"); exit(1); } seg = shmat(id, NULL, 0); if(seg == (char*) -1) { perror("shmat()"); exit(1); } for(s = seg; *s != NULL; s++) printf("%c", *s); printf("\n"); *seg = ':'; return 0; } [/code] :Bibliografia: Dave C (Link tá na introdução) :Contato: fpc@bsdmail.org morte137@gmail.com :Finalização: Espero que tenham gostado desse artigo sobre Shared Memory, tirem bom proveito dele :)