#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
![]() |
![]() |
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica ![]() |
|
![]() |
![]() |