#include #include #include #define MAX_ELEMENTS_PLUS_ONE 4 typedef char item_t[256]; struct ring_buffer { item_t data[MAX_ELEMENTS_PLUS_ONE]; size_t first; size_t last; }; void initBuffer(struct ring_buffer *buffer) { memset(buffer, 0, sizeof(*buffer)); } void put(struct ring_buffer *buffer, const item_t *item) { if ((buffer->last + 1) % MAX_ELEMENTS_PLUS_ONE == buffer->first) // the buffer is full, now what? raise(SIGUSR1); memcpy(&buffer->data[buffer->last], item, sizeof(*item)); buffer->last = (buffer->last + 1) % MAX_ELEMENTS_PLUS_ONE; } void get(struct ring_buffer *buffer, item_t *item) { if (buffer->last == buffer->first) // the buffer is empty, what now? raise(SIGUSR2); memcpy(item, &buffer->data[buffer->first], sizeof(*item)); buffer->first = (buffer->first + 1) % MAX_ELEMENTS_PLUS_ONE; } int main() { struct ring_buffer buffer; initBuffer(&buffer); printf("g gets data from buffer\n" "ptext... puts 'text...' to buffer\n"); while (1) { printf("> "); fflush(stdout); char cmd[2], c; item_t item = {0}; scanf("%1[^\n]%255[^\n]", cmd, item); do { // this reads all remaining characters in this line including '\n' c = getchar(); if (c == -1) return 0; } while (c != '\n'); switch (cmd[0]) { case 'p': put(&buffer, &item); break; case 'g': get(&buffer, &item); printf("%s\n", item); break; } } return 0; }