Ir para conteúdo
Fórum Script Brasil
  • 0

Memoria Compartilhada entre processos


Jesus kleiton

Pergunta

Ola, tudo bem? Estou fazendo uma aplicacao que consiste em 2 processos, o pai e o filho, o filho deve preencher um bloco de chars e coloca-lo em um segmento de memoria compartilhada, o pai, deve pegar o bloco desse segmento de memoria compartilhada e testa-lo.

Mas estou com alguns problemas, um deles e que não consigo fazer com que o filho preencha o segmento na segunda vez que executo o programa dando o erro "File exists".

Obs: o pai ainda não esta lendo o segmento... porem.. quando o filho termina, deveria aparecer uns printfs que botei pra testar o programa.. ou seja.. mesmo quando o filho consegue executar o shmget.. ainda sim o programa so vai ate o filho acabar sua execucao.. ignorando tudo o que coloquei no processo pai.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/time.h>
#include <string.h>

#include "semlib.h"


#define IPC_KEY 456
#define LENGTH 128

int  testa_bloco(char *b,unsigned t);
void preenche_bloco(char *b,unsigned t);

void preenche_bloco(char *b,unsigned t)
{
  unsigned i;
  char l='A';
  for (i=0;i<t;++i)  {
      *b++ = l;
      l = (l=='Z')?'A':l+1;
  }//fim do for
}//fim preenche_bloco

int testa_bloco(char *b,unsigned t)
{
  unsigned i;
  char l='A';
  for (i=0;i<t;++i)  {
      if (*b++ != l)
         return(0);
      l = (l=='Z')?'A':l+1;
  }//fim do for
  return(1);
}//fim testa_bloco

int main()
{
  int shmid, res;
  int size = 1024;
  char *mem;
  char bloco[LENGTH];   
  
  pid_t filho;
  
   
   /* Cria um segmento de memoria compartilhada. */
     shmid = shmget ( (key_t)IPC_KEY, size, IPC_CREAT | IPC_EXCL | 0x1c0 );
     if (shmid == -1) {
       printf("Error in shmget(): %s \n",strerror(errno));
       exit(1); 
     }
     printf("SHMID = %d \n",shmid); 
     filho = fork();
     if (filho==0)  {
        /* PREENCHE */
     
        preenche_bloco(bloco,LENGTH);   

     /* Conecta o seg. de mem. compartilhada ao seg. de dados do processo. */
        mem = shmat( shmid, (char *)0, 0);
        if (mem==(char *)-1) {
     printf("Error in shmat(): \n");
    }
    else {
                   
       strcpy(mem,bloco);
           /* Desconecta o segmento compartilhado. */
           res = shmdt (mem);
           if (res==-1) {
             printf("Error in shmdt(): %s\n",strerror(errno));
           }
    }
                
        printf("passou do strcpy  \n");
          
         return(0);
     }
     /* RECEBE MSG */
      
     printf("executou ate recebe msg01 \n",);

  
    return(0);
}

Por favor, alguém conseguiu perceber onde esta o problema ? Procurei algo sobre isso na internet, mas não vi nenhuma funcao que deixa-se esse segmento livre para ser usado novamente

desde já agradeco

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...