gpt4 book ai didi

c - 我如何检查c中信号量的状态?

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

我有一个全局静态变量,它是一个信号量,因为我正在编写一个库而不是一个程序。

在使用该库的 main() 程序中,有 fork() 的调用,以及基于共享内存的管道读写.

例如,这是使用我的库的 main():

#include <stdio.h>
#include <stdlib.h>
#include "my_pipe_shared_memory_based.h"
int main()

{
int spd, pid, rb;
char buff[4096];
my_new_init();

if (my_new_fifo("tmp_shm_pipe",0666) < 0)
{
perror("my_new_fifo");
exit(1);
}

if (fork())
{
spd = my_new_open("tmp_shm_pipe", O_RDONLY, 0600);
if (spd < 0)
{
perror("PARENT: my_new_open");
exit(1);
}
rb = my_new_read(spd, buff, sizeof(buff));
if (rb > 0)
write(1, buff, rb);
}

else
{
spd = my_new_open("tmp_shm_pipe", O_WRONLY, 0600);
if (spd < 0)
{
perror("SON: my_new_open");
exit(1);
}
my_new_write(spd, "hello world!\n", sizeof("hello world!\n"));
}

my_new_close(spd);
my_new_un_link("tmp_shm_pipe");
my_new_finish();

return 0;
}

现在,我想在每次进程在方法中读取和/或写入之前使用信号量:

  1. my_new_write()

  2. my_new_read()

现在的问题是,如何在上面请求的方法(例如 my_new_write & my_new_read)中每次检查信号量的状态,这样我就可以让如果另一个进程当前正在读/写,该进程会做他的事情,还是阻止它?

谢谢

最佳答案

这里的关键是你必须确保确保互斥的信号量对两个进程都是可见的。为此,您需要分配共享内存并在 fork 之前初始化信号量。对于此任务,您可以使用 mmap。示例(没有任何错误检查):

sem_t *sem = mmap(NULL, sizeof(sem_t),
PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);

之后,使用 sem_init 初始化信号量并确保第二个参数 pshared 非零。手册说:

If pshared is nonzero, then the semaphore is shared between processes, and should be located in a region of shared memory (see shm_open(3), mmap(2), and shmget(2)). (Since a child created by fork(2) inherits its parent's memory mappings, it can also access the semaphore.) Any process that can access the shared memory region can operate on the semaphore using sem_post(3), sem_wait(3), etc.

最后fork进程,正常使用sem_wait和sem_post。

编辑:

真的,尝试替换这个:

mySemaphore = sem_open("mySemaphore", O_CREAT, S_IRUSR | S_IWUSR);

有了这个:

mySemaphore = mmap(NULL, sizeof(sem_t),
PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
sem_init(mySemaphore, 1, 1);

在函数 my_new_open 中

关于c - 我如何检查c中信号量的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11559690/

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