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
Pergunta
Jesus kleiton
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.
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
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.