• Jueves 4 de Julio de 2024, 19:28

Autor Tema:  Problema Con Shmget  (Leído 721 veces)

werewereman

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problema Con Shmget
« en: Lunes 30 de Agosto de 2004, 14:19 »
0
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.