2017-02-15 10 views
0

Я работаю над заданием, в котором нам нужно использовать семафоры, чтобы сделать второй отпечаток родительского процесса до тех пор, пока ребенок не выполнит первый. Впервые с помощью семафоров я понял, как они работают, но я думаю, что у меня проблема с инициализацией sem_open().Семафор не работает должным образом

Следуя этим:

sem_t *sem_open(const char *name, int oflag); 

Я создал это:

sem_t *sem = sem_open("MYSEM", O_CREAT , 2); 

Однако при выполнении моей sem_wait являются ignored.This это вся моя программа:

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <semaphore.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <sys/wait.h> 


/* void ChildProcess(void) ChildProcess prototype */ 
/* void ParentProcess(void) ParentProcess prototype */ 

int main(int argc, char ** argv){ 

int pid; 
pid = fork(); 

sem_t *sem = sem_open("MYSEM", O_CREAT , 2); 

if (pid<0) 
{ 
    printf("Cannot create a child process"); 
    exit(EXIT_FAILURE); 
} 
else if (pid==0) 
{ 
    printf("I am the child process. \n"); 
    printf("The child process is done. \n"); 
    sem_post(sem); 
    exit(EXIT_SUCCESS); 
} 
    else 
{ 
    printf("I am the parent process. \n"); 
    sem_wait(sem); 
    printf("The parent process is done. \n"); 
} 
sem_destroy(sem); 
exit (EXIT_SUCCESS); 
} 

и что такое печать:

I am the parent process. 
The parent process is done. 
I am the child process. 
The child process is done. 

и что нужно напечатать это:

I am the parent process. 
I am the child process. 
The child process is done. 
The parent process is done. 

ответ

0

в родительском: создать семафор, напечатать сообщение, а затем ждать семафора.
у ребенка: вы создаете семафор, печатаете 2 сообщения, закрываете семафон и выходите.
Теперь родитель может вернуться из ожидания.

См http://man7.org/linux/man-pages/man3/sem_wait.3.html для тривиального примера

+0

Так что вы говорите, это добавить sem_post (СЭМ) после parrent процесса? –

+0

Произошло что-то очень странное. Я добавил sem_post (sem) в конце родителя, и он работал один раз, после чего он вернулся к неправильному принту, где игнорируется wait and post. –

+0

Вы не проверяете возвращаемое значение 'sem_open', сделайте это первым - и найденный мной вызов' sem_open' имеет 4 аргумента (linux man) – KevinDTimm

Смежные вопросы