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