Я пытаюсь реализовать двоичный семафор между двумя различными процессами и сценарием:
В родительском процессе создается объект семафора с одним семафором.Инициализация семафора в начальное значение ноль (0).Выполнение операции декремента в дочернем процессе и операции инкремента в родительском процессе.
Начальное значение - 0 Родитель - Приращение (1) Дочерний - Декремент (0)
Я реализовал waitpid () в родительском процессе, чтобы дождаться дочернего процесса.Хотя я поместил sleep в дочерний блок, чтобы дать родителю первый доступ к семафору, чтобы он мог сначала увеличивать семафор, но все же дочерний - не в состоянии получить увеличенное значение семафора, созданное родителем.Поскольку семафор может использоваться между различными процессами, увеличенное значение семафора должно быть доступно дочернему элементу.
Может кто-нибудь предложить, что необходимо изменить в программе, чтобы дочерний элемент мог уменьшить семафор с 1 ->0?Я дал код:
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#define KEY1 12345
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
int main()
{
int ret1,ret, sem, id2;
union semun u1;
struct sembuf sboa,sb;
int status;
sem = semget(KEY1, 1, IPC_CREAT|0600);
if(sem<0) { perror("error in semaphore creation"); exit(1); }
u1.val = 0;
ret1=semctl(sem,0,SETVAL,u1);
ret1 = semctl(sem,0,GETVAL);
printf("Initial value of sem - %d\n",ret1);
ret= fork();
if(ret<0)
{
perror("error in chid");
exit(1);
}
if(ret==0)
{
sleep(1);
printf("child.....before decrement..the value of sem - %d\n",ret1);
sboa.sem_num = 0;
sboa.sem_op = -1;
sboa.sem_flg = 0;
semop(sem, &sboa, 1);
ret1 = semctl(sem,0,GETVAL);
printf("child.....after decrement..the value of sem - %d\n",ret1);
exit(0);
}
if(ret>0)
{
printf("parent.....before increment..the value of sem - %d\n",ret1);
sboa.sem_num = 0;
sboa.sem_op = +1;
sboa.sem_flg = 0;
semop(sem,&sboa, 1);
ret1 = semctl(sem,0,GETVAL);
printf("parent....after increment ..the value of sem - %d\n",ret1);
}
ret = waitpid(-1,&status,0);
if(ret > 0 )
{
printf("Child with the id: %d terminated\n", ret);
if(WIFEXITED(status))
{
printf("Process exited normally\n");
}
else
{
printf("Process exited abnormally");
}
}
else
{
perror("Error in executing waitpid\n");
exit(1);
}
semctl(sem,0,IPC_RMID);
return(0);
}
// Фактический выход программы выглядит так:
Начальное значение sem - 0
parent .....до приращения .. значение sem - 0
parent .... после приращения .. значение sem - 1
--> parent incremented
child ..... до уменьшения ..значение sem - 0
--> child not getting incremented value
child ..... после уменьшения .. значение sem - 0
Child с идентификатором: 13800 прекращено
Процесс завершился нормально
// Я ожидаю, что результат будет:
Начальное значение sem - 0
parent ..... перед приращением..theзначение sem - 0
parent .... после приращения .. значение sem - 1
child ..... до приращения .. значение sem - 1
child ..... после декремента..значение sem - 0
Child с идентификатором: 13800 прекращено
Процесс завершен нормально
Может кто-нибудь предложить, что нужно изменить в программе, чтобы ребенок мог уменьшитьсемафор от 1 -> 0?