1
« en: Lunes 30 de Agosto de 2004, 14:19 »
Buenas,
A ver, pregunta, el codigo que pego mas abajo me da errores si quiero reservar
memoria para aproximadamente mas de 150 estructuras. Compilado con g++ bajo Linux.
He probado a cambiar por diferentes valores la clave de ftok. Si por ejemplo
uso como clave ".", me deja reservar memoria para muy pocas. Si uso "/tmp"
unas cuantas mas, si uso "/dev/null" otras cuantas....
Pero tiene que ver la clave con la memoria pedida? Yo quiero poder reservar un
trozo de memoria compartida de 1000 o 2000 estructuras... que problema hay?
Está en la clave o donde? :?
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <linux/types.h>
#include <string.h>
#include <sys/time.h> //gettymeofday
#include <unistd.h>
struct a
{
int t1;
int t2;
timeval t3;
} *nets;
key_t clave;
int shmid;
main()
{
int num=20;
clave=ftok(".",'a');
// clave=ftok("/tmp",'a');
shmid=shmget(clave,sizeof(a)*num,IPC_CREAT | 0600);
nets=(a *)shmat(shmid,0,0);
//a partir de aqui es solo debug...
shmid_ds lalaa;
shmctl(shmid,IPC_STAT,&lalaa);
fprintf(stdout,"tamanio segmento: %d\n", lalaa.shm_segsz);
fprintf (stderr, "sizeof: %d\n",sizeof(a)*num);
switch(errno)
{
case EINVAL: printf ("EINVAL");break;
case EEXIST: printf ("EEXIST");break;
case EIDRM: printf ("EIDRM");break;
case ENOSPC: printf ("ENOSPC");break;
case ENOENT: printf ("ENOENT");break;
case EACCES: printf ("EACCESS");break;
case ENOMEM: printf ("ENOMEM");break;
}
fprintf (stderr, "error %d, %s\n", errno, strerror (errno));
fprintf(stdout, "dirección de nets: <%x>\n",nets);
}
saludos,
were.