Este programa funciona (lo probé), aunque el semáforo no está en la memoria compartida. Tenga en cuenta cómo creo la variable una vez, antes de la bifurcación ().
Por otro lado, un semáforo creado con sem_init() necesita estar en memoria compartida para funcionar. Pero sigue siendo una estructura sem_t , entonces, ¿por qué no requiere memoria compartida?
¿Son los contenidos de la estructura sem_t de alguna manera diferentes?
sem_t *s = sem_open("mysemaphore1", O_CREAT, 0600, 0); if (fork()) { sleep(3); sem_post(s); } else { sem_wait(s); printf("Woke\n"); }El semáforo creado por sem_open() es un semáforo con nombre. El propósito básico del semáforo con nombre es que se use entre procesos no relacionados. El semáforo creado por sem_init() es un semáforo sin nombre. Es más liviano que el semáforo mencionado y debe colocarse en la memoria compartida si se usa entre procesos relacionados. Si se usa entre subprocesos del mismo proceso, se puede mantener en una variable global.
El puntero devuelto por sem_open() es en realidad un puntero a una memoria mapeada por mmap() con el indicador MAP_SHARED establecido. Dado que este tipo de memoria persiste en fork() , puede usar la misma variable tanto en el padre como en el hijo para acceder al semáforo nombrado.