Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Linux. Komunikacja międzyprocesowa przez pamięć dzieloną System V

Ostatnio zmodyfikowano 2016-11-28 18:47
Autor Wiadomość
BloodyNomad
Temat założony przez niniejszego użytkownika
Linux. Komunikacja międzyprocesowa przez pamięć dzieloną System V
» 2016-11-28 15:36:51
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.

Póki co mogę zapisać i odczytać komunikat ale bez stosowania tablicy.

C/C++
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.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 z międzyprocesowej\n" );
    fprintf( stderr, "\nPOSTAĆ WYWOŁANIA:  <nazwa programu> (z)apisz <text>\n" );
    fprintf( stderr, "                   (o)dczytaj\n" );
   
    exit( 1 );
}
P-154217
j23
» 2016-11-28 18:47:01
Po co tworzysz ten sam temat? -> http://cpp0x.pl/forum/temat/?id=24024
P-154222
« 1 »
  Strona 1 z 1