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;