Дочерний процесс не обращается к увеличенному значению семафора System V, выполненному родительским процессом - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь реализовать двоичный семафор между двумя различными процессами и сценарием:

В родительском процессе создается объект семафора с одним семафором.Инициализация семафора в начальное значение ноль (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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...