Ciao a tutti, con grande urgenza a causa di una scadenza universitaria vi pongo questo quesito:
Perchè se io creo un semaforo, lo inizializzo ad 1 e poi gli dico di attendere che sia 0 tutto funzioona, mentre se la richiesta che sia 0 la metto all'interno di un altro processo tramite una fork lo stesso codice non funziona?
codice 1
codice 2codice:#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <sys/sem.h> #include <sys/shm.h> #define SIZE 1024 //Dimensione Buffer int main(){ //#########################VARIABILI######################################## //Var Semafori struct sembuf * sops = (struct sembuf *) malloc (sizeof(struct sembuf)); int semid; char *stringa, str[100]; int pid; //Creo i semafori if((semid = semget(11,1,IPC_CREAT|IPC_EXCL|0666))== -1){ perror("semget"); exit(1); } sops[0].sem_num = 0; sops[0].sem_op = 1; sops[0].sem_flg = 0; semop(semid,sops,1); //############Creo ed inizializzo gli "nProc" processi############################## pid = fork(); if(pid == 0){ sops[0].sem_num = 0; sops[0].sem_op = 0; sops[0].sem_flg = 0; semop(semid,sops,1); printf("entrato"); } sprintf(str,"fine\n"); write(1,str,strlen(str)); //Elimino i Semafori semctl(semid,0,IPC_RMID,0); return 0;
codice:#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <sys/sem.h> #include <sys/shm.h> #define SIZE 1024 //Dimensione Buffer int main(){ //#########################VARIABILI######################################## //Var Semafori struct sembuf * sops = (struct sembuf *) malloc (sizeof(struct sembuf)); int semid; char *stringa, str[100]; int pid; //Creo i semafori if((semid = semget(11,1,IPC_CREAT|IPC_EXCL|0666))== -1){ perror("semget"); exit(1); } sops[0].sem_num = 0; sops[0].sem_op = 1; sops[0].sem_flg = 0; semop(semid,sops,1); //############Creo ed inizializzo gli "nProc" processi############################## sops[0].sem_num = 0; sops[0].sem_op = 0; sops[0].sem_flg = 0; semop(semid,sops,1); sprintf(str,"fine\n"); write(1,str,strlen(str)); //Elimino i Semafori semctl(semid,0,IPC_RMID,0); return 0;

Rispondi quotando