子进程不访问父进程完成的递增的System V信号量值

时间:2019-03-27 17:34:01

标签: linux operating-system fork semaphore producer-consumer

我正在尝试在两个不同的进程和方案-之间实现二进制信号量:

在父进程中,创建仅包含一个信号量的信号量对象。将信号量初始化为初始值零(0)。 在子进程中执行递减操作,在父进程中执行递增操作。

初始值-0 父级-增量(1) 儿童-减量(0)

我已经在父进程中实现了waitpid()以等待子进程。 尽管我在子块中设置了睡眠状态,以便父母可以首先访问信号量,以便它可以先增加信号量,但仍然可以增加孩子的体重-无法获得父母完成的信号量的增量值。 由于可以在不同的进程之间使用信号量,因此该信号量的增量值应该对孩子可用。

有人可以建议在程序中需要进行哪些更改,以便孩子可以将信号量从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

父级.....在增加.sem值之前-0

父级。...增加后。.sem的值-1

                                             --> parent incremented 

child ..... sem的值递减之前-0

                                             --> child not getting incremented value 

child ..... sem的值递减后-0

id:13800的孩子被终止

进程正常退出


//我希望输出为:

sem的初始值-0

父级.....在增加.sem值之前-0

父级....增加后..sem的值-1

child .....在减少sem的值之前-1

child ..... sem的值递减后-0

id:13800的孩子被终止

进程正常退出


有人可以建议程序中需要更改的内容,以便孩子将信号量从1减少到0吗?

0 个答案:

没有答案