在Posix中使用共享内存 在C语言中使用Semaphore等待和信号。

问题描述 投票:0回答:1

以下面这段代码为例。代码在打印等待后停止,直到手动停止程序,但并没有发出下一个函数的信号。我检查了多次(甚至去掉了互斥),发现在程序的 forwhile 是导致问题的原因。

根据其他用户的说法,我必须使用 共享内存 以使其工作,但我不知道如何使用它或将其应用于这个特定的代码。

为了更好地了解这种情况,我看了很多网站,如 https:/www.geeksforgeeks.orgposix-shared-memory-api

我看到的最推荐的是 shmget()mmap().

所以问题是,我怎么才能得到 sem_wait() 在使用共享内存的任何类型的循环里面工作?

#include <stdio.h>
#include <semaphore.h> 
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <fcntl.h> 
#include <sys/shm.h> 
#include <sys/stat.h> 
sem_t *mutex; 
void wait_t(int a)
{
    for (int i = 0; i < 3; i++)
    {
        if (a < 0)
        {
            sem_wait(&mutex);
            printf("waiting\n"); //Stops here due lack of shared memory
        }
        a--;
    }
}

void signal_t(int a)
{
    for (int i = 0; i < 3; i++)
    {
        if (a <= 0)
        {
            printf("signal\n");
            sem_post(&mutex);
        }
        a++;
    }
}

int main()
{ 
    int shared_mem_id = shmget(IPC_PRIVATE, sizeof(sem_t), IPC_CREAT);
    mutex = shmat(shared_mem_id, NULL, 0);
    sem_init(&mutex, 1, 1);
    int i = -2;
    if(fork() == 0){ // create 1st child process
        mutex = shmat(shared_mem_id, NULL, 0);
        wait_t(i);
        exit(0);
        shmdt(mutex);
    }

    wait(NULL);
    if(fork() == 0){ // create 2nd child process
        mutex = shmat(shared_mem_id, NULL, 0);
        signal_t(i);
        exit(0);
        shmdt(mutex);
    }

    wait(NULL);
    if(fork() == 0){ // create 3nd child process
        mutex = shmat(shared_mem_id, NULL, 0);
        signal_t(i);
        exit(0);
        shmdt(mutex);
    }
    wait(NULL);
    printf("%d\n", i);
    exit(0); 
}
c posix semaphore shared-memory
1个回答
1
投票

所以,我们的想法是,你的父进程需要创建一个新的共享内存空间。

shared_mem_id = shmemget(IPC_PRIVATE, sizeof(sem_t), IPC_CREAT);

然后所有需要访问旗语的进程都需要这样做。

sem_t *mutex = shmat(shared_mem_id, NULL, 0);

(所以在分叉后,你需要在每个子进程中执行这个操作)

然后,使用semaphore的函数需要对mutex指针进行访问(记得要给mutex添加一个dereference)。

一旦它们完成,每个使用mutex的进程都需要做。

shmdt(mutex);

当然,只要你分配了足够的空间,你可以随意在共享内存中存储更复杂的结构。

© www.soinside.com 2019 - 2024. All rights reserved.