/* prvy proces */ #include #include #include #include #include #include #include #define MEM_SZ 4096 struct shared_use_st { int written_by_you; char some_text[BUFSIZ]; }; int main (int argc, char * argv[]) { int running = 1; void *shared_memory = (void *) 0; struct shared_use_st *shared_stuff; int shmid; srand ((unsigned int) getpid ()); shmid = shmget ((key_t) 1234, MEM_SZ, 0666 | IPC_CREAT); if (shmid == -1) { fprintf (stderr, "shmget failed\n"); exit (EXIT_FAILURE); } shared_memory = shmat (shmid, (void *) 0, 0); if (shared_memory == (void *) -1) { fprintf (stderr, "shmat failed\n"); exit (EXIT_FAILURE); } printf ("Memory attached at %X\n", shared_memory); shared_stuff = (struct shared_use_st *) shared_memory; shared_stuff->written_by_you = 0; while (running) { if (shared_stuff->written_by_you) { printf ("You wrote: %s", shared_stuff->some_text); sleep (rand () % 4); /* make the other process wait for us ! */ shared_stuff->written_by_you = 0; if (strncmp (shared_stuff->some_text, "end", 3) == 0) { running = 0; } } } if (shmdt (shared_memory) == -1) { fprintf (stderr, "shmdt failed\n"); exit (EXIT_FAILURE); } if (shmctl (shmid, IPC_RMID, 0) == -1) { fprintf (stderr, "shmctl(IPC_RMID) failed\n"); exit (EXIT_FAILURE); } exit (EXIT_SUCCESS); } /* druhy proces */ #include #include #include #include #include #include #include #define MEM_SZ 4096 struct shared_use_st { int written_by_you; char some_text[BUFSIZ]; }; int main (int argc, char * argv[]) { int running = 1; void *shared_memory = (void *) 0; struct shared_use_st *shared_stuff; char buffer[BUFSIZ]; int shmid; shmid = shmget ((key_t) 1234, MEM_SZ, 0666 | IPC_CREAT); if (shmid == -1) { fprintf (stderr, "shmget failed\n"); exit (EXIT_FAILURE); } shared_memory = shmat (shmid, (void *) 0, 0); if (shared_memory == (void *) -1) { fprintf (stderr, "shmat failed\n"); exit (EXIT_FAILURE); } printf ("Memory attached at %X\n", shared_memory); shared_stuff = (struct shared_use_st *) shared_memory; while (running) { while (shared_stuff->written_by_you == 1) { sleep (1); printf ("waiting for client...\n"); } printf ("Enter some text: "); fgets (buffer, BUFSIZ, stdin); strcpy (shared_stuff->some_text, buffer); shared_stuff->written_by_you = 1; if (strncmp (buffer, "end", 3) == 0) { running = 0; } } if (shmdt (shared_memory) == -1) { fprintf (stderr, "shmdt failed\n"); exit (EXIT_FAILURE); } exit (EXIT_SUCCESS); }