读写共享内存

时间:2014-11-21 18:01:58

标签: c operating-system posix shared-memory semaphore

我有一个程序,其中我有一个父进程,我想创建3个子进程。

我还为每个共享内存创建了2个共享内存(IN,OUT)和1个信号量。

这个想法是:

父进程有3个整数,必须在共享内存(IN)中写入其中一个整数。然后其中一个子进程读取它,进行一些计算并在父进程读取结果的共享内存(OUT)中写入内容。然后父进程将下一个整数添加到共享内存中,依此类推..

这是我的代码的一部分,我尝试实现第一部分(从共享内存IN写入读取):

// create and attach shared memory

memidIN = shmget(...);
memidOUT= shmget(...);          
pointerIN = (...) shmat(...);       
pointerOUT = (...) shmat(...);      

// create and init semaphores

semIN = semget(...);
semOUT = semget(...);
semctl(semIN, ...);   // initialize both to 1
semctl(semOUT, ...);

for (i = 0; i < children; ++i) 
{
    pid = fork();

    if (pid) 
    {
        // parent process code

        down sem_IN
            write in shmIN
        up sem_IN

    } 
    else if (pid == 0) 
    {
        // Children processes code

        down sem_IN 
            read from shmIN
        up sem_IN

        exit(0);    

    } 
    else 
        //ERROR


}

    // dont die until childrens die
    for( j = 0; j < children; j++)
        wait(&status);

问题是,我怎样才能确定子进程读取正确的值?我的意思是如果父进程写入5然后一个进程应该采取它,做一些事情,在OUT中写一些东西。那么父母应该写另一个值,比方说10。 在我的程序中,5可以由子进程读取2次或更多次。

我是否应该使用互斥量信号量来确保子进程读取正确的值并确保父进程在其中一个子进程读取后更新该值?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

因此,您可以通过以下方式在IN共享内存中排列数据:

int Number;
bool Number_IsRead; // Initialized by 'true'.

当您需要传递号码时,您应该

Number_IsRead = false;

孩子在阅读Number之前应该检查Number_IsRead。 当Number已读取时,child应该为Number_IsRead指定true。

如果你有3个孩子需要读取数字,你应该创建3个标志(bool Number_IsRead [3])。 您还必须在更改Number或Number_IsRead时使用信号量。

P.S。通常,使用共享内存而不是消息队列(msgget / msgctl / msgsnd / msgrcv / etc.)并不是一个好主意。