ciao a tutti, c'è qualcosa che non mi torna in questo codice che ho fatto. Dopo la wait e dopo il signal faccio stampare a video il valore del semaforo ed è sempre 0, come è possibile se l'ho inizializzato a 1?

codice:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#include <stdlib.h>
#include <stdio.h>

#define KEY 1901 

main()
{

int semid = semget(KEY, 2, IPC_CREAT | 0600);
semctl(semid, 0, SETVAL, 1);

//creo 5 figli
int i,x, num_rich;
for(i=0;i<5;i++){
 x=fork();
 if(!x) {
    break;
 }
}

if(!x){
//WAIT
struct sembuf cmd={0,-1,0};
semop(semid, &cmd,1);

int val = semctl(semid, 0, GETVAL, NULL);
printf("valore del semaforo0 dopo WAIT: %d, il mio pid: %d \n", val, getpid());

sleep(10);
printf("SON PASSATO IO %d \n", getpid());

//SIGNAL
struct sembuf cmd2={0,1,0};
semop(semid, &cmd2,1);

val = semctl(semid, 0, GETVAL, NULL);
printf("valore del semaforo0 dopo SIGNAL: %d, il mio pid: %d \n", val, getpid());
}}