2

在我的代码中,我执行以下初始化:

struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL ,
        .status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE };

int initPipe()
{
    if (!myPipe.init)
    {
        myPipe.mutex = mmap (NULL, sizeof *myPipe.mutex, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);

        if (!sem_init (myPipe.mutex, 1, 0))  // semaphore is initialized to 0
        {
            myPipe.init = TRUE;
        }
        else
            perror ("initPipe");
    }
    return 1;   // always successful
}

我可以有多个可以从中调用的进程main()(注意fork)。

谢谢

4

1 回答 1

1

AFAICS 你的错误在你的控制变量中。只有您的mutex变量在进程之间共享,而不是您的initflag变量。这些是写时复制,因此您不会在不同的过程中看到更改。

您必须将所有控制变量打包到您创建的段中。为您需要的所有字段创建适当的struct类型。

顺便说一句,调用信号量mutex真的是个坏主意。互斥体具有与信号量完全不同的语义。(或者如果你真的将它用作互斥锁,我没有检查,在初始化程序中使用pthread_mutex_twith 。)pshared

编辑后编辑:不,它不会像这样工作。您确实必须将整体struct放在共享段中。所以你struct PipeShm必须包含 asem_t sem而不是 a sem_t* mutex。然后你会做类似的事情

struct PipeShm * myPipe = 0;

int initPipe()
{
    if (!myPipe->init)
    {
        myPipe = mmap (NULL, sizeof *myPipe, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);

        if (!sem_init (myPipe->sem, 1, 0))  // semaphore is initialized to 0
        {
            myPipe->init = true;
        }
        else
            perror ("initPipe");
    }
    return 1;   // always successful
}

您应该注意的其他事项:

  • sem_t接口可以被任何类型的 IO 或其他信号中断。您必须始终检查这些函数的返回,尤其是在收到函数时重新启动该函数EINTR
  • Mondern C 有一个布尔值。您可以通过包含 和的<stdbool.h>名称轻松使用它。boolfalsetrue
于 2012-07-29T10:49:01.097 回答