#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>
typedef struct{
int i;
int lock;
}Flag;
void error_and_die(const char *msg) {
perror(msg);
exit(EXIT_FAILURE);
}
int main(int argc, char *argv[]) {
int r;
const char *memname = "sample";
const size_t region_size = sysconf(_SC_PAGE_SIZE);
printf("_SC_PAGE_SIZE:%d\n",region_size*2);
int fd = shm_open(memname, O_CREAT | O_TRUNC | O_RDWR, 0666);
if (fd == -1)
error_and_die("shm_open");
r = ftruncate(fd, region_size);
if (r != 0)
error_and_die("ftruncate");
void *ptr = mmap(0, region_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
error_and_die("mmap");
close(fd);
Flag *d = (Flag *) ptr;
d->i=0;
d->lock=1;
pid_t pid = fork();
pid = fork();
pid = fork();
while(d->i<32){
if(d->lock==0){
sleep(1);
}else{
d->lock=0;
printf("%d-- return pid and my pid is:%d,%d\n",(d->i)++,pid,getpid());
d->lock=1;
sleep(1);
}
}
if(d->lock){
d->lock=0;
r = munmap(ptr, region_size);
if (r != 0)
error_and_die("munmap");
r = shm_unlink(memname);
if (r != 0)
error_and_die("shm_unlink");
}
return 0;
}
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>
typedef struct{
int i;
int lock;
}Flag;
void error_and_die(const char *msg) {
perror(msg);
exit(EXIT_FAILURE);
}
int main(int argc, char *argv[]) {
int r;
const char *memname = "sample";
const size_t region_size = sysconf(_SC_PAGE_SIZE);
printf("_SC_PAGE_SIZE:%d\n",region_size*2);
int fd = shm_open(memname, O_CREAT | O_TRUNC | O_RDWR, 0666);
if (fd == -1)
error_and_die("shm_open");
r = ftruncate(fd, region_size);
if (r != 0)
error_and_die("ftruncate");
void *ptr = mmap(0, region_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED)
error_and_die("mmap");
close(fd);
Flag *d = (Flag *) ptr;
d->i=0;
d->lock=1;
pid_t pid = fork();
pid = fork();
pid = fork();
while(d->i<32){
if(d->lock==0){
sleep(1);
}else{
d->lock=0;
printf("%d-- return pid and my pid is:%d,%d\n",(d->i)++,pid,getpid());
d->lock=1;
sleep(1);
}
}
if(d->lock){
d->lock=0;
r = munmap(ptr, region_size);
if (r != 0)
error_and_die("munmap");
r = shm_unlink(memname);
if (r != 0)
error_and_die("shm_unlink");
}
return 0;
}