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:
#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 2
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;