【发布时间】:2017-05-21 17:56:01
【问题描述】:
当您访问内存块(实际情况下使用 mmap 为 fe)时,sem_t 的正确指针必须是 4 的倍数。如果不是,那么 sem_init() 仍然不会返回 -1(错误值),但是sem_t 无效。为什么会这样?
下面的代码显示了信号量的行为。
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <strings.h> //bzero
int main(int argc, const char *argv[]) {
//sizeof(sem_t) == 32 on 86_64, 16 on 86
void *adrr = malloc(sizeof(sem_t)*2);
bzero(adrr, sizeof(sem_t)*2);
sem_t *sem1 = adrr+1;
if(sem_init(sem1, 1, 0) == -1) printf("ERROR\n");
sem_wait(sem1);
printf("Not working\n");
bzero(adrr, sizeof(sem_t)*2);
sem_t *sem2 = adrr+2;
sem_init(sem2, 1, 0);
sem_wait(sem2);
printf("Not working\n");
bzero(adrr, sizeof(sem_t)*2);
sem_t *sem3 = adrr+3;
sem_init(sem3, 1, 0);
sem_wait(sem3);
printf("Not working\n");
bzero(adrr, sizeof(sem_t)*2);
sem_t *sem4 = adrr+4;
sem_init(sem4, 1, 0);
sem_wait(sem4);
printf("Working\n");
free(adrr);
return 0;
}
【问题讨论】:
-
The POSIX
sem_initreference 没有说明必须将sem_t对象放置在可被 4 整除的地址上。您从哪里获得这些信息? -
将 1 添加到 void 指针(即
adrr)似乎很奇怪。见stackoverflow.com/questions/6449935/… -
我对此一无所知,但是当我运行上面的代码时,只有最后一个指针指向的信号量正常工作。
-
您应该传递一个指向有效对齐的
sem_t结构的指针。如果传递的指针未如此对齐,则会得到未定义的行为。您必须使用 GCC。标准 C 不允许对void指针进行算术运算。 -
当函数的参数:
main()未使用时,则使用签名:int main( void )