![]() |
|
|
google unix.com
|
|||||||
| Foros | Registro | Reglas de los Foros | Enlaces | Álbumes | Preguntas más frecuentes | Lista de miembros | Calendario | Búsqueda | Puestos de hoy | Marcar Foros Como Leídos |
| 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 |
![]() |
|
|
Linkback vínculo | Herramientas de hilo | Buscar en este Hilo | Tasa de Hilo | Modos de visualización |
|
|
|
||||
|
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:
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. |
|
||||
|
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 |
|
||||
|
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
|
|
||||
|
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. |
|
||||
|
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?
|
|
||||
|
Puede establecer pp \u003d cabeza, pero nunca nada en la cabeza a su ejemplo.
|
|
||||
|
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 .. |
![]() |
| Marcadores |
| Herramientas de hilo | Buscar en este Hilo |
| Modos de visualización | Vota a este hilo |
|
|