shm_com.h:
#ifndef _SHMCOM_H_HEADER #define _SHMCOM_H_HEADER #define TEXT_SZ 2048 struct shared_use_st { int written; char text[TEXT_SZ]; }; #endif
consumer:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/shm.h> #include <pthread.h> #include "shm_com.h" pthread_rwlock_t rwlock; int main(){ int shmid; srand((unsigned int)getpid()); shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT); if (shmid == -1) { fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); } void *shared_memory = (void *)0; 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", (long)shared_memory); struct shared_use_st *shared_stuff; shared_stuff = (struct shared_use_st *)shared_memory; shared_stuff->written = 0; int running = 1; while(running){ if (shared_stuff->written){ pthread_rwlock_wrlock(&rwlock); printf("You wrote: %s", shared_stuff->text); sleep( rand() % 4 ); shared_stuff->written = 0; pthread_rwlock_unlock(&rwlock); if (strncmp(shared_stuff->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); }
producer:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/shm.h> #include <pthread.h> #include "shm_com.h" pthread_rwlock_t rwlock; int main(){ int shmid; shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT); if (shmid == -1){ fprintf(stderr, "shmget failed\n"); exit(EXIT_FAILURE); } void *shared_memory = (void *)0; 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", (long)shared_memory); struct shared_use_st *shared_stuff; shared_stuff = (struct shared_use_st *)shared_memory; int running = 1; char buffer[BUFSIZ]; while(running){ while(shared_stuff->written == 1){ sleep(1); printf("waiting for client...\n"); } pthread_rwlock_wrlock(&rwlock); printf("Enter some text: "); fgets(buffer, BUFSIZ, stdin); strncpy(shared_stuff->text, buffer, TEXT_SZ); shared_stuff->written = 1; pthread_rwlock_unlock(&rwlock); if (strncmp(buffer, "end", 3) == 0) { running = 0; } } if (shmdt(shared_memory) == -1) { fprintf(stderr, "shmdt failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }