#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

#define SHM_FILE    "shm-file"
#define K   1024

struct message {
  int clr2send;
  char mbuf[K];
};

/**
 * Compile with: gcc -o writer writer.c -lrt
 */

int main(void)
{
  char mesg[K];
  struct message *m;

  int sfd = shm_open(SHM_FILE, O_RDWR | O_CREAT | O_TRUNC, 0666);
  if (sfd < 0) {
    perror("shm_open");
    return 1;
  }

  if (ftruncate(sfd, sizeof(struct message)) < 0) {
    perror("ftruncate");
    close(sfd);
    shm_unlink(SHM_FILE);
    return 1;
  }

  m = mmap(NULL, sizeof(struct message), PROT_READ | PROT_WRITE, MAP_SHARED, sfd, 0);
  if (m == MAP_FAILED) {
    perror("mmap");
    close(sfd);
    shm_unlink(SHM_FILE);
    return 1;
  }

  m->clr2send = 0;

  while (1) {
    printf("? ");
    if (fgets(mesg, K, stdin) == NULL) break;
    while (m->clr2send == 0) usleep(100000);
    strncpy(m->mbuf, mesg, K);
    m->clr2send = 0;
  }

  close(sfd);
//  shm_unlink(SHM_FILE);
  return 0;
}
