Чтобы семафор работал в разных процессах, он должен находиться в общей памяти и инициализироваться с помощью pshared==1
- Вы не помещаете семафор в общую память.Посмотрите, например, shm_open
или mmap
.
Вы также должны инициализировать семафор перед тем, как fork()
- инициализация семафора дважды не работает.Также используйте sem_wait
вместо sem_trywait
, поскольку вы хотите заблокировать семафор.Если вы хотите, чтобы sem_trywait
хотя бы проверил, успешно ли выполнена часть try
.
РЕДАКТИРОВАТЬ: исправленный источник.
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
sem_t * sem; /* MODIFIED: We want a semaphore in shared memory, using a pointer instead */
int shared=0;
int pid;
void func()
{
sem_wait(sem); /* MODIFIED &sem to sem */
if(pid==0)printf("Child entered\n");
else if(pid>0)printf("Parent entered\n");
sleep(2);
shared++;
sem_post(sem); /* MODIFIED &sem to sem */
if(pid==0)printf("Child exited\n");
else if(pid>0)printf("Parent exited\n");
}
int main()
{
/* MODIFIED: Put semaphore in shared memory */
sem = mmap(0, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
/* MODIFIED: Initial count of 1, so that a sem_wait will succeed */
sem_init(sem,1,1);
/* MODIFIED: fork() after sem_init() */
pid=fork();
if(pid==0){
printf("In child\n");
func();
}
else {
func();
}
}