Linux - Programacion en C (memoria compartida)

   
Vista:

Programacion en C (memoria compartida)

Publicado por yael_lopez89 (1 intervención) el 15/10/2008 03:00:45
Es un ejemplo para uso de memoria compartida en este caso estoy compartiendo enteros y todo al parecer esta bien, en la funcion "writeshm" escribo a la memoria y en la funcion "readshm" leo lo k esta en la memoria compartidad,
Algun ejemplo para correr el programa es este:
shmtool e 123
shmtool l
shmtool b
shmtool m 660

El problema k tengo sk cuando kiero k imprima el contenido con la orden "shmtool l" me imprime un numero k no es el k le estoy dando a en la orden anterior.
Haber si me pueden ayudar a solucionar este problema.

De antemano le doy las gracias.
----------------------------------------------
#include
#include
#include
#include
#include

#define segsize 100

int main( int argc, char *argv[] ){
key_t key;
int shmid, cntr;
int *segptr;
int num;

if(argc ==1)
usage();

/*Obtener clave IPC*/
key = ftok(".",'S');

/*Abrir (crear si es necesario) el segmento de memoria compartida*/
if(( shmid = shmget( key, segsize, IPC_CREAT | IPC_EXCL | 0666 )) == -1 ){
printf( "El segmento existe - abriendo como cliente " );

/*El segmento existe - abrir como cliente*/
if(( shmid = shmget( key, segsize, 0)) == -1 ){
perror( "Error en shmget" );
exit(1);
}
}
else {
printf( "Creando nuevo segmento ");
}

/*Ligar el proceso actual al segmento*/
segptr = (int *)shmat( shmid, 0, 0);

switch( tolower(argv[1][0])){

case 'e' : num = atoi(argv[2]);
writeshm( shmid, &segptr, num );
break;
case 'l' : readshm( shmid, &segptr );
break;
case 'b' : removeshm( shmid );
break;
case 'm' : changemode( shmid, argv[2] );
break;
default: usage();
}
}

writeshm( int shmid, int *segptr, int text ){
*segptr = 123;
printf( "Hecho... " );
}
readshm( int shmid, int *segptr ){
printf( "Valor de segptr: %d ", *segptr );
}
removeshm( int shmid ){
shmctl(shmid, IPC_RMID, 0 );
printf( "Segmento marcado para borrado " );
}
changemode( int shmid, char *mode ){
struct shmid_ds myshmds;

/* Obtener valor actual de la estructura de datos internos*/
shmctl( shmid, IPC_STAT, &myshmds);

/* Mostrar antiguos permisos*/
printf( "Antiguos permisos: %o ", myshmds.shm_perm.mode);

/* Convertir y cargar el modo*/
sscanf( mode, "%o", &myshmds.shm_perm.mode);

/* Actualizar el modo*/
shmctl( shmid, IPC_SET, &myshmds);

printf( "Nuevos permisos : %o ", myshmds.shm_perm.mode);
}
usage(){
fprintf( stderr, "shmtool - Utilidad para usar memoria compartida ");
fprintf( stderr, " USAGE: shmtool (e)scribir ");
fprintf( stderr, " (l)eer ");
fprintf( stderr, " (b)orrar ");
fprintf( stderr, " (m)odo ");
exit(1);
}
-------------------------------------------------------
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Programacion en C (memoria compartida)

Publicado por Tom (346 intervenciones) el 15/10/2008 10:08:25
Estas liando un cacao impresionante con los punteros, repasa ese tema, porque no lo tienes nada claro.

La primera pista, seguramente te la está dando el compilador ya que te estará marcando bastantes warnings.

Otra pista:

si defines

int *segptr;

y una función:

void writeshm(int, int*, int) {};

lo más normal es que la invoques con los parámetros que espera, o sea:

writeshm(shmid, segptr, num);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar