From sem_init manpage:
If pshared is nonzero, then the semaphore is split between the processes and should be located in the shared memory area (see shm_open (3), mmap (2) and shmget (2)). (Since the child created by fork (2) inherits its parent memory mappings, it can also access the semaphore.) Any process that can access the shared memory area can work on the semaphore using sem_post (3), sem_wait (3), and so on. .d.
POSIX semaphores are structures on the stack. They do not reference kernel-supported structures such as filedescriptors. If you want to share the POSIX semaphore with two processes, you need to take care of partial separation yourself.
This should work:
#include <fstream> #include <iostream> #include <semaphore.h> #include <stdio.h> #include <string> #include <sysexits.h> #include <sys/mman.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char *argv[]){ using namespace std; sem_t* semp = (sem_t*)mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED, 0, 0 ); if ((void*)semp == MAP_FAILED) { perror("mmap"); exit(EX_OSERR); } sem_init(semp, 1 /*shared*/, 0 /*value*/); pid_t pid = fork(); if(pid < 0) { perror("fork"); exit(EX_OSERR); } if (pid==0){ //parent cout << "parent id= " << getpid() << endl; sem_wait(semp); cout << "child is done." << endl; }else { //child cout << "child id= " << getpid() << endl; for (int i = 0; i < 10; i++) cout << i << endl; sem_post(semp); } return 0; }
Note. . If you want only this behavior, then waitpid is obviously the way to go. I assume you want to test POSIX semaphores.
source share