#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/times.h>
#include <sys/time.h>
#include <sched.h>
#include <sys/wait.h>
struct shared {
volatile int status[2];
volatile int turn;
volatile char data[256];
};
#define FREE 0
#define BUSY 1
#define CHILD 0
#define PARENT 1
void myexit(int ret);
void shared_init(struct shared *s);
int cs_entry(struct shared *s);
void cs_exit(struct shared *s);
int shm_id = -1;
struct shared *s = (void *)-1;
int this_proc,other_proc;
long proc_hit = 0;
int nprove = -1;
int main(int argc,char *argv[])
{
char value = 0;
volatile char *p;
pid_t pid;
int i,j,count = 0;
if (argc != 2) {
printf("Uso: %s <numero di prove>\n",argv[0]);
myexit(5);
}
if (sscanf(argv[1],"%d",&nprove) != 1 || nprove <= 0) {
printf("%s non va bene come <numero di prove>\n",argv[1]);
myexit(5);
}
shm_id = shmget(IPC_PRIVATE, sizeof(struct shared), 0777);
if (shm_id == -1) {
perror("shmget");
myexit(5);
}
if ( (s = shmat(shm_id, NULL , 0)) == (void *)-1) {
perror("shmat");
myexit(5);
}
shared_init(s);
if ( (pid = fork()) == -1 ) {
perror("fork");
myexit(5);
}
if (pid == 0) { /* child */
this_proc = CHILD;
other_proc = PARENT;
for(j=0; j<nprove ; j++) {
value = ++value % 2;
p = s->data;
proc_hit += cs_entry(s);
for (i=0;i<sizeof(s->data);i++) {
*p++ = value;
}
cs_exit(s);
count++;
}
printf("Figlio: Eseguiti %d controlli\n",count);
printf("Figlio: collisioni col padre %ld \n",proc_hit);
myexit(0);
} else { /* parent */
this_proc = PARENT;
other_proc = CHILD;
for(j=0; j< nprove ; j++) {
p = s->data;
proc_hit += cs_entry(s);
value = s->data[0];
for (i=0;i<sizeof(s->data);i++)
if (*p++ != value) { printf("Problema\n"); }
cs_exit(s);
count++;
}
printf("Padre: Eseguiti %d controlli\n",count);
printf("Padre: collisioni col figlio %ld \n",proc_hit);
wait(NULL);
myexit(0);
}
}
void myexit(int ret)
{
struct shmid_ds shds;
if (s != (void *)-1) shmdt(s);
if (shm_id != -1) shmctl(shm_id,IPC_RMID,&shds);
exit(ret);
}
void shared_init(struct shared *s)
{
int i;
s->status[CHILD] = FREE;
s->status[PARENT] = FREE;
s->turn = CHILD;
for (i=0 ; i<sizeof(s->data) ; i++) s->data[i] = 0;
}
int cs_entry(struct shared *s)
{
int ret = 0;
s->status[this_proc] = BUSY;
s->turn = other_proc;
while ((s->status[other_proc] == BUSY) && (s->turn != this_proc)) {
ret = 1;
}
return ret;
}
void cs_exit(struct shared *s)
{
s->status[this_proc] = FREE;
}
--
AntonioValletta - 14 Dec 2001