我有一个全局静态变量,它是一个信号量,因为我正在编写一个库,而不是一个程序。
在使用该库的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;
}
现在,我想在每次进程阅读和/或编写之前使用信号量:
my_new_write()
my_new_read()
现在,问题是,我如何在上面请求的方法中检查信号量的状态(例如my_new_write
&amp; my_new_read
),这样我就可以让这个过程完成他的事情,如果另一个进程正在读/写,则阻止它?
谢谢
答案 0 :(得分:2)
这里的关键是你必须确保两个进程都能看到确保互斥的信号量。为此,您需要分配共享内存并在分叉之前初始化信号量。对于此任务,您可以使用例如mmap。示例(没有任何错误检查):
sem_t *sem = mmap(NULL, sizeof(sem_t),
PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
在此之后,使用sem_init初始化信号量并确保第二个参数pshared为非零值。手册说:
如果pshared为非零,则信号量在进程之间共享,并且应位于共享内存的区域中(请参阅shm_open(3),mmap(2)和shmget(2))。 (由于fork(2)创建的子进程继承了父进程的内存映射,因此它也可以访问信号量。)任何可以访问共享内存区域的进程都可以使用sem_post(3),sem_wait(3)等对信号量进行操作。
最后,分叉进程并正常使用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
中答案 1 :(得分:1)
sem_trywait()和sem_wait()不是你要找的东西吗?用信号量句柄调用它们,你就会知道它们的状态。
http://pubs.opengroup.org/onlinepubs/7908799/xsh/sem_trywait.html
不确定信号量,但带有互斥锁的pthread_cond_timedwait()也可以让您检查同步状态而不会阻塞线程(或给出超时)。