The UNIX and Linux Forums  


Go Back   El UNIX y Linux Foros > Arriba Foros > Programación de Alto Nivel
.
google unix.com



Programación de Alto Nivel Plantear preguntas acerca de C, C + +, Java, SQL, y otros lenguajes de programación aquí.

Más UNIX y Linux Foro Temas usted puede encontrar útiles
Hilo Hilo para principiantes Foro Respuestas Último mensaje
[C] Problemas con la memoria compartida hurricane86 Programación de Alto Nivel 2 11-26-2008 05:58 PM
La memoria compartida de biblioteca compartida otheus Programación de Alto Nivel 0 09-03-2008 04:55 AM
Memoria compartida en la biblioteca compartida DreamWarrior Programación de Alto Nivel 12 05-30-2007 05:33 PM
compartir la memoria - no de memoria compartida -- elzalem Programación de Alto Nivel 9 05-02-2007 08:45 AM
La memoria compartida, pero la escasez de memoria sin utilizar lotes cjcamaro UNIX para usuarios avanzados y expertos 1 10-13-2004 06:10 PM

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
Linkback vínculo Herramientas de hilo Buscar en este Hilo Tasa de Hilo Modos de visualización
  #1 (Enlace permanente)  
Old 06-28-2009
BeNdErR BeNdErR is offline
Usuario Registrado
  
 

Fecha: junio 2009
Publicaciones: 4
Problemas con la memoria compartida y las listas

Hola, tengo que poner en una lista de memoria compartida con objeto de esta estructura:


Código:
typedef struct Obj{
char objname[20];
struct Obj *nextObj;
}Object

He llenado mi lista (por ejemplo) 10 elementos, pero cuando intento ponerlo en la memoria compartida para ser leído por otro proceso i obtener fallo de segmentación después de la primera lectura de registro ..
He leído en otro hilo (aquí -> dinámica de memoria compartida ) que malloc Sone da problemas con la memoria compartida
Cita:
Si usted llama a crear malloc linked_list_header-> ptr, luego la dirección devuelta por malloc es privada a la convocatoria (el proceso que llama a malloc) proceso. Mismo con NODO-> buffer. Usted tendrá que asignar estas cosas en común "a mano" sin poner malloc.
pero no entiendo lo que tengo que hacer ahora y cómo solucionar mi problema.

Traté de compartir objeto de esta manera:

Código:
Obj *head;     //pointer to the head of my FILLED list
int shmid;
Obj *sh;
...
shmid = shmget(SHMKEY,(sizeof(Obj)*10),0666|IPC_CREAT|IPC_EXCL);
...
sh = (Obj *)shmat(shmid, 0, 0666);
...
*sh = *head;

Probablemente se me olvida algo o tal vez estoy totalmente equivocado ... ¿cómo puedo asignar Obj en común "a mano" sin poner malloc?

Gracias por tu apoyo, cuanto mejor.
  #2 (Enlace permanente)  
Old 06-29-2009
mgessner mgessner is offline
Usuario Registrado
  
 

Fecha: octubre 2007
Puestos: 50
Aquí está el problema: los punteros que malloc () devuelve a los locales son el espacio de direcciones del proceso que llama malloc (). Esos valores no significan nada en el contexto de otro proceso. Por lo tanto, poner esos números en la memoria compartida y el uso de otro proceso de invocar el comportamiento indefinido. Si tiene suerte, luego de su programa de choque. Si no estás de suerte, podría causar una supernova en algún lugar (un poco de humor C).

Así que lo que debe hacer es asignar una parte de la memoria compartida, y escribir un "malloc" y "libre" que utilizan el conjunto de la memoria. En otras palabras, usted tiene que escribir una pequeña memoria asignador / deallocator que utiliza esta memoria compartida piscina y, a continuación, pasa atrás de compensaciones. Ya que todos sus objetos son los mismos, esto será bastante trivial.

Aviso he dicho "compensaciones" y no "direcciones". No recuerdo nada en cualquier lugar que he leído que garantiza que la memoria compartida se le asignará la misma dirección en los diferentes procesos. Asumiendo así, y la utilización de estos valores en sus listas es probable que te llevarán de vuelta a su problema original. Así que tendrá que manejar este problema de manera inteligente.

Puede escribir a este ser de carácter general (se encargará de la asignación de cualquier tamaño) o específica (sólo se ocupa de cosas de su tipo struct Obj). De cualquier manera está bien, pero creo que el ejercicio de la escritura en general le enseñará más.

Esta es una tarea bastante fácil, pero hay algunas cosas que vigilar. Le daré dos:

a) Sólo un proceso puede inicializar la memoria compartida piscina. PRIMERA iniciar este proceso, inicializar la piscina y, después, inicie los otros. De lo contrario, usted puede tener múltiples procesos Trashing su piscina.

b) ¿Qué ocurre si un proceso que es la asignación de algo de esta piscina se interrumpe durante el medio de una asignación, y otro proceso también se trata de asignar algo de esta piscina. Advertencia: si lo hace mal, va a pasar cosas malas, y su madre se reirán de usted. Tenga en cuenta que para acceder a la lista también puede conducir a los mismos tipos de problemas, porque en el caso general no es necesario saber si otro proceso que cooperaron ha manipulado la lista.

Otra cosa: en su puesto, que había:


Código:
*sh = *head;

Esto no es cierto: a) usted no desea cambiar el contenido de sh, y b) que desea la cabeza a punto de sh, no al revés.

HTH
  #3 (Enlace permanente)  
Old 06-29-2009
BeNdErR BeNdErR is offline
Usuario Registrado
  
 

Fecha: junio 2009
Publicaciones: 4
Thumbs up

gracias por su respuesta Yo resuelto mi problema de otra manera .. pero voy a intentar su solución también la práctica hace la perfección!

pero hay algunas otras preguntas y respuestas que me gustaría saber:

1) Yo me reí en voz alta en su humor, en serio xD Soy uno de los que se escapa si alguien dividir por cero en una calculadora (Odio agujero negro);

2) Yo resuelto mi problema de esta manera: (7 es el número en el objeto de mi lista)

Código:
Obj *pp, *head;
...
..
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
			perror("shmget");
			exit(1);
		}
		
		if((sh = (Obj *)shmat(shmid, 0, 0777)) ==(Obj *) -1){
			perror("shmat");
			exit(1);
		}
		int a;
		pp = head;
		for(a=0; a<7; a++){
			*(sh+a) = *pp;
			pp = pp->next;
		}
...

parece funcionar bien. Por el otro "lado" y leer los datos de esta manera:

Código:
Obj *p, *List;
...
p=List;
for(a=0; a<7; a++){
		*p=*(sh+a);
		p=p->next;
	}
...

¿qué piensa usted de eso?

3) Soy un poco desordenado, con memoria compartida. Quiero decir, lo que yo supongo que sobre la forma en que se trabaja - (espero que usted entienda mi Inglés-para-dummies-idioma-nivel) - como un "cuadro" donde puede poner las cosas. Pero si trato de poner dentro de un puntero que obtendrá maaany problemas. Por lo tanto, la lista que he PUTTED en (con mi método) ya no se comporta como una lista, pero es más probable que un """"" cadena """"" (para ver "" ).
ejemplo:

Código:
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
			perror("shmget");
			exit(1);

ahora he hecho una caja de 7 ranuras de x-dimensión. una vez que adjuntar la memoria
(... .. shmat) X se convierte en un verdadero valor, en mi caso Obj. entonces he Obj 7 ranuras de tamaño cada uno.
cuando i llenar mi casilla de arriba, i llenar individualmente se desplazan a través de ranuras de memoria compartida con sh + +, y no con el puntero a la siguiente obj.

es mi opinión, ¿verdad? o completamente equivocado?


gracias de nuevo
  #4 (Enlace permanente)  
Old 06-30-2009
mgessner mgessner is offline
Usuario Registrado
  
 

Fecha: octubre 2007
Puestos: 50
Este es un problema:

Código:
Obj *pp, *head;
...
pp = head;

/* other stuff involving pp, which is wrong because pp was set to an unknown value. */

jefe nunca fue inicializado. Usted siempre debe inicializar un puntero antes de usarlo. Debe ser NULL (en cuyo caso usted no desreferenciaba) o el punto que se debe a algo.

Creo que lo que hay que hacer es hacer un dibujo (un cuadro, tal vez) y dividirla en trozos (tantos como usted tiene los objetos) y luego extraer las flechas que representan a los punteros.

Su código de más abajo no funciona porque es correcto, sino porque son obras de mala suerte.
  #5 (Enlace permanente)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Usuario Registrado
  
 

Fecha: junio 2009
Publicaciones: 4
espera, me olvidé de decir que * la cabeza es la cabeza de mi lista .. Así que he inicializar cada puntero al menos en valor NULL?
  #6 (Enlace permanente)  
Old 06-30-2009
mgessner mgessner is offline
Usuario Registrado
  
 

Fecha: octubre 2007
Puestos: 50
Puede establecer pp \u003d cabeza, pero nunca nada en la cabeza a su ejemplo.
  #7 (Enlace permanente)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Usuario Registrado
  
 

Fecha: junio 2009
Publicaciones: 4
Sí, no a causa de la longitud de la parte donde establecer el valor de la cabeza thougth era mejor decir que la cabeza fue el puntero a la cabeza de mi lista en lugar de publicar el código totalmente ..
Reply

Marcadores

Herramientas de hilo Buscar en este Hilo
Buscar en este Hilo:

Búsqueda avanzada
Modos de visualización Vota a este hilo
Vota a este hilo:

Normas de envío
puede que no nuevo puesto de hilos
puede que no enviar respuestas
puede que no enviar archivos adjuntos
puede que no editar sus puestos

Código BB es Encendido
Emoticones son Encendido
[IMG] código Encendido
Código HTML es Apagado
Trackbacks son Encendido
Pingbacks son Encendido
Refbacks son Encendido




Todas las horas son GMT -4. La hora es 09:46 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traducciones de idiomas Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Estudios
El UNIX y Linux Foros Contenido Copyright © 1993-2009. Todos los derechos Reserved.Ad Gestión por RedTyger

Las direcciones URL de contenido vBSEO 3.2.0