#include #include #include #include #include #include /* For O_* constants */ #include /* For mode constants */ #include /* For mode constants */ #include #define SEM_NAME "mysem" #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) int count = 0; int main(int argc, char *argv[]) { int fd, i, nloop, zero = 0; int *ptr; int status; pid_t pid; sem_t *sem; if ( argc != 3 ) { fprintf(stderr, "usage: %s <#loops>\n", argv[0]); exit(-1); } nloop = atoi(argv[2]); fd = open(argv[1], O_RDWR | O_CREAT, FILE_MODE); assert(fd != -1); write(fd, &zero, sizeof(int)); ptr = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); assert(ptr != MAP_FAILED); sem = sem_open(SEM_NAME, O_CREAT | O_EXCL, FILE_MODE, 1); sem_unlink(SEM_NAME); setbuf(stdout, NULL); if ( (pid = fork()) == 0 ) { for ( i = 0; i < nloop; i++ ) { sem_wait(sem); printf("child: %d\n", (*ptr)++); sem_post(sem); } exit(0); } for ( i = 0; i < nloop; i++ ) { sem_wait(sem); printf("parent: %d\n", (*ptr)++); sem_post(sem); } waitpid(pid, &status, 0); exit(0); }