gpt4 book ai didi

c - 共享内存中的 POSIX 未命名信号量未响应发布或等待

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:53 25 4
gpt4 key购买 nike

我有未命名的信号量,我按照我找到的方法将其放置在一个进程的共享内存中 here on SO

在 P0 中:

/* addr is a pointer to the base of the shared memory area */
sem_t *sem = (sem_t*) addr;
void *usableSharedMemory = (char*) addr + sizeof(sem_t)
sem_init(sem, 1, 0);

在 P1 中:

if ((addr = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
exit(EXIT_FAILURE);
}

sem_t *my_sem = (sem_t*) addr;
...
sem_post(my_sem);
...
sem_wait(my_sem);

如果我在发布或等待之前和之后调用 sem_getvalue(my_sem),信号量的值不会改变。我有这样的打印要调试:

int v = 0;
v = sem_getvalue(rsem, &v);
printf("BEFORE-POST:%d\n", v);
sem_post(rsem);
v = sem_getvalue(rsem, &v);
printf("AFTER-POST:%d\n", v);

在调用 sem_post 之前和之后,信号量值为零 (0)。

最佳答案

我以前没有使用过这种信号量,但我看到了一些可能会被绊倒的东西。

我对其他 SO 帖子建议的时髦指针数学并不感兴趣,而且我无法从这里判断这两个进程是否实际上在与同一 block 共享内存通信。

在这种情况下,一个好主意是避免指针数学并使用一个结构来覆盖共享内存段,这样你就有一个清晰的组织,并添加一个魔数(Magic Number),这样每个人都可以判断他们是否获得了有效段或一些随机的虚假内存:

#define MYSHM_MAGIC 12345987  // can be anything random-ish

struct mysharedmem {
int magicvalue;
sem_t MySemaphore;
void *UsableMemory;
};

此结构覆盖了您的共享内存段,并允许您使用一致且更具可读性的访问方法,尤其是当您添加各方都同意的其他变量时。创建段的代码应该初始化它:

// in P1 ?
struct mysharedmem *myshm = mmap(NULL, SIZE, ...);

myshm->magic = MYSHM_MAGIC;
sem_init(&myshm->MySemaphore, 1, 0);
...

然后在另一个过程中,一旦获得共享地址,实际上询问段“你是从我想的地方来的吗?”通过检查魔数(Magic Number)。数字的大小无关紧要,只要双方同意即可。

// In P0 ?
struct mysharedmem *myshm = addr; // obtained somehow

if (myshm->magic != MYSHM_MAGIC)
{
error - we don't see the special magic number
}
.. do stuff

P0 如何获得 P1 创建的共享内存段的句柄?

关于c - 共享内存中的 POSIX 未命名信号量未响应发布或等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58601281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com