Code:
#include <stdio.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <string.h>
void
do_writers()
{
fprintf(stderr, "starting writer.\n");
int fd = shm_open("/example", O_CREAT | O_RDWR, 0666);
int val1 = 8;
int val2 = 16;
int val3 = 32;
ftruncate(fd, sizeof(val1));
char *buf = mmap(0, 8, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
memcpy(buf, &val1, sizeof(val1));
sleep (15);
ftruncate(fd, sizeof(val2) + sizeof(val3));
memcpy(buf, &val2, sizeof(val2));
memcpy(&buf[sizeof(val2)], &val3, sizeof(val3));
sleep (15);
fprintf(stderr, "writer leaving.\n");
}
void
do_readers()
{
fprintf(stderr, "starting reader.\n");
int val1, val2, val3;
int fd = shm_open("/example", O_RDONLY, 0666);
while (fd == -1) {
sleep(1);
fd = shm_open("/example", O_RDONLY, 0666);
fprintf(stderr, "reader trying and waiting.\n");
}
char *buf = mmap(0, sizeof(val1), PROT_READ, MAP_SHARED, fd, 0);
memcpy(&val1, buf, sizeof(val1));
fprintf(stderr, "reader so far: %d\n", val1);
sleep(20);
memcpy(&val2, buf, sizeof(val2));
memcpy(&val3, &buf[sizeof(val2)], sizeof(val3));
fprintf(stderr, "Reader read: %d %d %d\n", val1, val2, val3);
}
int main(int argc, char **argv)
{
if (argc != 2) {
fprintf(stderr, "stupid <mode> \n");
return -1;
}
int mode = atoi(argv[1]);
if (mode == 0) {
do_writers();
}
else {
do_readers();
}
return 1;
}