#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SEGSIZE 100
main(int argc, char *argv[])
{
key_t key;
int shmid, cntr;
char *segptr;
if(argc == 1)
usage();
/* utwórz unikalny klucz poprzez wywołanie ftok() */
key = ftok(".", 'S');
/* otwórz segment pamięci dzielonej - utwórz jeżeli trzeba */
if((shmid = shmget(key, SEGSIZE, IPC_CREAT|IPC_EXCL|0666)) == -1)
{
printf("Segment pamięci dzielonej istnieje - otwieram jako klient");
/* 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 ( mapuj ) segment pamięci dzielonej do tego procesu */
if((segptr = shmat(shmid, 0, 0)) == -1)
{
perror("shmat");
exit(1);
}
switch(tolower(argv[1][0]))
{
case 'z': writeshm(shmid, segptr, argv[2]);
break;
case 'o': readshm(shmid, segptr);
break;
case 'u': removeshm(shmid);
break;
case 't': changemode(shmid, argv[2]);
break;
default: usage();
}
}
writeshm(int shmid, char *segptr, char *text)
{
strcpy(segptr, text);
printf("Zrobiono...\n");
}
readshm(int shmid, char *segptr)
{
printf("segptr: %s\n", segptr);
}
removeshm(int shmid)
{
shmctl(shmid, IPC_RMID, 0);
printf("Segment pamięci dzielonej ustawiony do usunięcia\n");
}
changemode(int shmid, char *mode)
{
struct shmid_ds myshmds;
/* pobierz aktualne warto¶ci wewnętrznej struktury danych */
shmctl(shmid, IPC_STAT, &myshmds);
/* wy¶wietl stare prawa dostępu */
printf("Stare prawa dostępu: %o\n", myshmds.shm_perm.mode);
/* konwertuj i załaduj prawa dostępu */
sscanf(mode, "%o", &myshmds.shm_perm.mode);
/* aktualizuj tryb */
shmctl(shmid, IPC_SET, &myshmds);
printf("Nowe prawa dostępu : %o\n", myshmds.shm_perm.mode);
}
usage()
{
fprintf(stderr, "shmtool - narzędzie do majstrowania segmentem pamięci dzielonej\n");
fprintf(stderr, "\nUŻYCIE: shmtool (z)apisz <text>\n");
fprintf(stderr, " (o)dczytaj\n");
fprintf(stderr, " (u)suń\n");
fprintf(stderr, " (t)ryb <tryb ósemkowo>\n");
exit(1);
}