繁体   English   中英

在 Posix 信号量中使用共享 memory 等待并在 C 中发出信号

[英]Using Shared memory in Posix Semaphore wait and signal in C

以下面的代码为例。 代码在打印后停止,等待手动停止程序,但不会发出下一个 function 的信号。 我检查了多次(甚至删除了互斥),发现在forwhile内是导致问题的原因。

根据其他用户的说法,我必须使用共享的 memory才能使其正常工作,但我不知道如何使用它或将其应用于此特定代码。

我查看了许多网站以更好地了解这种情况,例如https://www.geeksforgeeks.org/posix-shared-memory-api/

我见过的最推荐的是shmget()mmap()

那么问题来了,我怎样才能让sem_wait()使用 Shared memory 在任何类型的循环中工作?

#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); 
}

所以,这个想法是你的父进程需要创建一个新的共享 memory 空间:

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

然后所有需要访问信号量的进程都需要做:

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

(所以你需要在 fork 之后的每个子进程中执行此操作)

然后使用信号量的函数将需要访问互斥指针(记得添加对互斥的取消引用)。

完成后,使用互斥锁的每个进程都需要执行以下操作:

shmdt(mutex);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM