#include<iostream>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/mman.h>
#include <unistd.h>
#include<semaphore.h>
using namespace std;
int main(void) {
     sem_t sem;
    int *shm;
    shm=(int*)mmap(NULL ,4,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0);
    sem_init(&sem,1,1);
   
    int pid=fork();
    if (pid==0) {
            sem_wait(&sem);
            cout<<"locked by child"<<endl;
                     *shm=3;
            sem_post(&sem);
            cout<< "cf" <<endl;
    } else {
          usleep(50*1000);
            sem_wait(&sem);
            cout<< "lock parent" <<endl;
            for (int i=0;i<10;i++) {
                    *shm+=1;
            sem_post(&sem);
            cout<< "pl"<<endl;
            wait(NULL);
    }
}
return 0;
}
