我按照我发现的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)。
我有一个未命名的信号量,它按照我在P0中在这里找到的方法,在一个进程中放入共享内存中:/ * addr是指向共享内存区域基址的指针* / sem_t * ...] >
我以前没有使用过这种信号量,但是我看到了很多可以绊倒的东西。
[我并没有退出其他SO帖子所建议的时髦指针数学,而且我无法从此处判断两个进程是否实际上在与共享内存的同一块进行通信。