Cześć. Mam program do komunikacji międzyprocesowej, tworzący segment pamięci dzielonej pozwalający zapisywać i odczytywać komunikaty.
Mam problem z dodaniem opcji żeby moje komunikaty zapisywały się w tablicy w segmencie pamięci dzielonej w taki sposób:
- zapisz k "komunikat" - zapisz komunikat w wierszu k tablicy stringów w pamięci dzielonej,
- odczytaj k - odczytaj komunikat z wiersza k tablicy w pamięci dzielonej.
[cpp]#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <string.h>
#define SEGSIZE 100
main( int argc, char * argv[] )
{
int shmid, cntr;
char * segptr;
/* Jeśli nie wpisano parametru przejdź do usage() */
if( argc == 1 )
usage();
/* utwórz unikalny klucz poprzez wywołanie ftok() */
key_t key;
key = ftok( ".", 'S' );
/* otwórz segment pamięci dzielonej - utwórz jeżeli trzeba; nadanie praw do segmentu */
if(( shmid = shmget( key, SEGSIZE, IPC_CREAT | IPC_EXCL | 0666 ) ) == - 1 )
{
printf( "Segment pamięci dzielonej istnieje - otwieram jako klient\n" );
/* Segment prawdopodobnie istnieje - próbuję otworzyć jako klient */
if(( shmid = shmget( key, SEGSIZE, 0 ) ) == - 1 )
{
perror( "shmget" );
exit( 1 );
}
}
else
{
printf( "Tworzenie nowego segmentu pamięci dzielonej\n" );
}
/* Podłącz segment pamięci dzielonej do tego procesu */
if(( segptr = shmat( shmid, 0, 0 ) ) == - 1 )
{
perror( "shmat" );
exit( 1 );
}
/* Wybór funkcji zapisu/odczytu ze zmianą dużej litery na małą */
switch( tolower( argv[ 1 ][ 0 ] ) )
{
case 'z': writeshm( shmid, segptr, argv[ 2 ] );
break;
case 'o': readshm( shmid, segptr );
break;
/* Jeśli wybrano zły parametr przechodzi do usage() */
default: usage();
}
}
/* Zapisuje w pamięci wpisany text /
writeshm( int shmid, char * segptr, char * text )
{
strcpy( segptr, text );
printf( "Zrobiono...\n" );
}
/ Zwraca na stdout wartości zapisane w pamięci */
readshm( int shmid, char * segptr )
{
printf( "segptr: %s\n", segptr );
}
/* Wyświetla schemat prawidłowego wywołania programu */
usage()
{
fprintf( stderr, "Program do komunikacji międzyprocesowej\n" );
fprintf( stderr, "\nPOSTAĆ WYWOŁANIA: <nazwa programu="programu"> (z)apisz <text>\n" );
fprintf( stderr, " (o)dczytaj\n" );
exit( 1 );
}[/cpp]
Jak to rozwiązać?