Se continua a darti lo stesso errore allora potrebbe darsi che quando esegui l'attach, il semaforo sia già stato distrutto.
Per verificarlo fai questa prova:
stampa semid e sospendi il programma prima dell attach. Poi da terminale usa il comando ipcs -s e controlla che ci sia effettivamente un semaforo con quel semid.
Nel caso il semaforo non ci sia più azzarderei un ipotesi: nel processo padre distruggi il semaforo prima della morte del processo figlio. Assicurati di distruggere il semaforo solo dopo aver eseguito while(wait(NULL) != -1); o un oppurtuna wait equivalete.