/* ----------------------------------------------------------------- */ /* PROGRAM client.c */ /* This is the client program. It can only be started as the */ /* server says so. The client requests the same shared memory the */ /* server established, attaches it to its own address space, takes */ /* the data, changes the status to TAKEN, detaches the shared memory,*/ /* and exits. */ /* ----------------------------------------------------------------- */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include "shm-02.h" void main(void) { key_t ShmKEY; int ShmID; struct Memory *ShmPTR; ShmKEY = ftok(".", 'x'); ShmID = shmget(ShmKEY, sizeof(struct Memory), 0666); if (ShmID < 0) { printf("*** shmget error (client) ***\n"); exit(1); } printf(" Client has received a shared memory of four integers...\n"); ShmPTR = (struct Memory *) shmat(ShmID, NULL, 0); if ((int) ShmPTR == -1) { printf("*** shmat error (client) ***\n"); exit(1); } printf(" Client has attached the shared memory...\n"); while (ShmPTR->status != FILLED) ; printf(" Client found the data is ready...\n"); printf(" Client found %d %d %d %d in shared memory...\n", ShmPTR->data[0], ShmPTR->data[1], ShmPTR->data[2], ShmPTR->data[3]); ShmPTR->status = TAKEN; printf(" Client has informed server data have been taken...\n"); shmdt((void *) ShmPTR); printf(" Client has detached its shared memory...\n"); printf(" Client exits...\n"); exit(0); }