c - 当两个进程试图访问一个信号量 = 0 的临界区时会发生什么?

标签 c linux shared-memory semaphore

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

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)。

谢谢

最佳答案

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

您必须将所有控制变量打包到您创建的段中。创建一个合适的 struct输入您需要的所有字段。

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

编辑后编辑:不,它不会像这样工作。你真的必须把整个 struct在共享段中。所以你的 struct PipeShm必须包含 sem_t sem而不是 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接口(interface)可以被任何类型的 IO 或其他信号中断。你总是要检查 这些函数的返回,特别是重新启动函数 如果它收到 EINTR .
  • 现代 C 有一个 bool 值。您可以通过包含轻松使用 <stdbool.h>通过名字 bool , falsetrue .

关于c - 当两个进程试图访问一个信号量 = 0 的临界区时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708049/

相关文章:

进程间通信——pipe和fifo

在 C 中使用索引大于 50 的数组时进行核心转储

c - 在 Linux 中 fork

c++ - SYSTEM 进程是否可以与非 SYSTEM 进程共享数据?

c - IPC瓶颈?

c - 在 C 中使用函数指针的 Bubblesort 算法

c - 在 c 中获取进程 Cpu 使用情况

mysql - 无法在 debian 上安装 libmysql++-dev

linux - 为 Linux 使用 SIGCONT 和 CLONE() 和 CLONE_STOPPED 标志

c++ - Boost C++ 进程间