🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.os.linux.programacion
3 messages
3 total messages Started by David Serrano (Hue-Bond) Sun, 31 Jul 2005 22:13
Pasar estructura de datos dinámica a otro proceso
#1834
Author: David Serrano (Hue-Bond)
Date: Sun, 31 Jul 2005 22:13
27 lines
2133 bytes
Buenas.

Tengo un programita en C con varias estructuras de datos, la mayoría son
estáticas pero tengo un par de ellas que son dinámicas (que todavía no he
implementado pero creo que haré con un array de estructuras). Quiero
pasarlas todas a otro proceso mediante algún mecanismo de IPC como memoria
compartida o sockets.

Con las estáticas es sencillo:

memcpy (puntero_a_memoria_compartida, &estruct, sizeof (estruct));

Mi problema es que no puedo hacer eso con un puntero (el que apunta a la
estructura dinámica) porque el tercer parámetro sería sizeof(puntero) y
entonces no copiaría mucho, que digamos. ¿Cómo puedo hacerlo?

Además, el otro proceso debe saber cuántos miembros tiene el array, así que
debo pasarle el número aparte como un int. Así, la memoria compartida
quedaría de esta forma:

<datos estáticos><núm. de dinámicos><dinámico 1><dinámico 2>..<dinámico N>

Esto me parece un poco chapucilla... ¿hay alguna otra forma?


-- 
 David Serrano
Re: Pasar estructura de datos din�mica a otro proceso
#1836
Author: Oscar Garcia
Date: Sun, 31 Jul 2005 22:32
53 lines
3554 bytes
El Sun, 31 Jul 2005 22:13:28 +0000 (UTC), "David Serrano (Hue-Bond)"
<responder_solo_en_el_grupo@yahoo.es> escribi�:
>Mi problema es que no puedo hacer eso con un puntero (el que apunta a la
>estructura din�mica) porque el tercer par�metro ser�a sizeof(puntero) y
>entonces no copiar�a mucho, que digamos. �C�mo puedo hacerlo?

Lo ideal es que envies directamente la direcci�n a donde apunta tu
puntero y la longitud de la estructura. De este modo enviar�s los
datos reales y no el puntero.

>Adem�s, el otro proceso debe saber cu�ntos miembros tiene el array, as� que
>debo pasarle el n�mero aparte como un int. As�, la memoria compartida
>quedar�a de esta forma:
><datos est�ticos><n�m. de din�micos><din�mico 1><din�mico 2>..<din�mico N>
>Esto me parece un poco chapucilla... �hay alguna otra forma?

Si has estudiado la torre de protocolos ISO de OSI ver�s que est�
definido en la capa de presentaci�n (nivel 6).

�Qu� lenguaje de programaci�n usas? Presupongo que C por el memcpy que
haces.

En ese caso te recomiendo que te crees un modelo de datos abstracto
que sea consistente y que se acomode a tus necesidades.

Por ejemplo.

Si usas un modelo basado en listas enlazadas para obtener el n�mero de
elementos debes recorrer toda la lista hasta que llegues al �ltimo
eslab�n de la cadena y te diga "ya no quedan m�s datos" (casi siempre
marcado por un puntero al siguiente elemento NULL).

Cuando ese valor es necesario que se conozca muchas veces y ante gran
cantidad de datos entonces quiz� debieras crearte dos tipos de datos,
un "contenedor" de la lista en el que se almacena la cantidad de
elementos de la misma y que se actualiza en cada operaci�n de borrado
o inserci�n, y por otro lado el tipo de datos que contendr� realmente
la informaci�n (generalmente en forma de lista enlazada). El
"contenedor" deber�a apuntar al primer elemento de la lista.

A la hora de enviar los datos a trav�s de un socket entonces debes
plantearte un protocolo de nivel 6 que encapsule tus datos y que los
convierta en "multiplataforma" (conversi�n de las cadenas de
caracteres a UTF-8 por ejemplo, bits en datos enteros en orden de red,
etc) aparte de marcar el comienzo de una estructura, su tama�o y
contenido, marcas de inicio y final de volcados de datos, etc...

Un saludo.

-- 
�scar Javier Garc�a Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Re: Pasar estructura de datos dinámica a otro proceso
#1835
Author: Carlos
Date: Sun, 31 Jul 2005 22:36
38 lines
2456 bytes
David Serrano (Hue-Bond) wrote:
> Buenas.
> 
> Tengo un programita en C con varias estructuras de datos, la mayoría son
> estáticas pero tengo un par de ellas que son dinámicas (que todavía no he
> implementado pero creo que haré con un array de estructuras). Quiero

¿Un array de punteros a estructuras?

> pasarlas todas a otro proceso mediante algún mecanismo de IPC como memoria
> compartida o sockets.
> 
> Con las estáticas es sencillo:
> 
> memcpy (puntero_a_memoria_compartida, &estruct, sizeof (estruct));
> 
> Mi problema es que no puedo hacer eso con un puntero (el que apunta a la
> estructura dinámica) porque el tercer parámetro sería sizeof(puntero) y
> entonces no copiaría mucho, que digamos. ¿Cómo puedo hacerlo?

memcpy(p_a_m_c, p, sizeof(*p))
o memcpy(p_a_m_c, p, sizeof(struct el_tipo))

> Además, el otro proceso debe saber cuántos miembros tiene el array, así que
> debo pasarle el número aparte como un int. Así, la memoria compartida
> quedaría de esta forma:
> 
> <datos estáticos><núm. de dinámicos><dinámico 1><dinámico 2>..<dinámico N>
> 
> Esto me parece un poco chapucilla... ¿hay alguna otra forma?

No sé por qué te parece chapucilla... es un protocolo tan bueno como 
cualquier otro. Lo chapucilla sería no mantener las funciones que leen y 
escriben en el mismo archivo para que no queden desincronizados los 
cambios, y esas cosas, pero como protocolo, si no se necesita más, ¿para 
qué hacerlo más complicado?

Saludos.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads