gpt4 book ai didi

c - 使用信号量的一些问题

转载 作者:行者123 更新时间:2023-12-02 05:53:37 24 4
gpt4 key购买 nike

现在我正在处理我的项目,我有一个关于信号量初始化的问题。实际上我正在 Mac OS X 上编程,但我尝试在 Linux 上编译我的项目,但它无法编译。在 OS X 上它可以编译,但每次都会在初始化时崩溃。

sem_t *mutex_1, *mutex_2, *mutex_3, *reader, *writer;

int initialization_semaphores (void)
{
int ERROR = EOK;
if ((mutex_1 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;
if ((mutex_2 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;
if ((mutex_3 = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;
if ((reader = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;
if ((writer = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, 0, 0)) == MAP_FAILED)
ERROR = ESEM;

if (ERROR == EOK) {
if (sem_init(mutex_1, 1, 1) == -1)
ERROR = ESEM;
if (sem_init(mutex_2, 1, 1) == -1)
ERROR = ESEM;
if (sem_init(mutex_3, 1, 1) == -1)
ERROR = ESEM;
if (sem_init(reader, 1, 1) == -1)
ERROR = ESEM;
if (sem_init(writer, 1, 1) == -1)
ERROR = ESEM;
}
}

当我尝试在 Linux 上编译它时,我看到了这个:

/tmp/ccmkN9G7.o: In function `initialization_semaphores':
readerWriter.c:(.text+0x1a2): undefined reference to `sem_init'
readerWriter.c:(.text+0x1cb): undefined reference to `sem_init'
readerWriter.c:(.text+0x1f4): undefined reference to `sem_init'
readerWriter.c:(.text+0x21d): undefined reference to `sem_init'
readerWriter.c:(.text+0x246): undefined reference to `sem_init'
readerWriter.c:(.text+0x275): undefined reference to `shm_open'

是吗? :

int ERROR = EOK;
mutex_1 = sem_open("mutex1", O_CREAT, S_IRUSR | S_IWUSR, 1);
mutex_2 = sem_open("mutex2", O_CREAT, S_IRUSR | S_IWUSR, 1);
mutex_3 = sem_open("mutex3", O_CREAT, S_IRUSR | S_IWUSR, 1);
reader = sem_open("reader", O_CREAT, S_IRUSR | S_IWUSR, 1);
writer = sem_open("writer", O_CREAT, S_IRUSR | S_IWUSR, 1);

最佳答案

Mac OSX 不符合标准,不支持 sem_init。该函数存在,但它默默地失败或更糟,给您留下一个不起作用的信号量。

我鼓励您向 Apple 提交错误,因为这是一个真正的、长期存在的问题,严重影响应用程序的可移植性。提示的人越多,解决问题的希望就越大。

至于解决这个问题,您可以尝试查找/编写所有 POSIX 信号量函数的替换实现并将您的程序链接到该实现,或者您可以切换到使用 sem_open 而不是 mmapsem_init

(只要您已经经历了为每个信号量映射整个页面的开销,sem_open 就不会真正花费您更多的费用。这个错误确实是一个令人头疼的问题是当您想要将信号量包含在现有结构中时。)

关于c - 使用信号量的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10406834/

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