【发布时间】:2012-07-19 11:16:17
【问题描述】:
我有一个全局静态变量,它是一个信号量,因为我正在编写一个库而不是一个程序。
在使用该库的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&my_new_read),所以我可以让进程做他的事情,或者阻止它,如果另一个进程当前正在读/写?
谢谢
【问题讨论】:
-
您的信号量“mySemaphore”在不同进程中不可见。看我的回答。
-
您也可以简单地尝试在 sem_open 调用中将“S_IRUSR | S_IWUSR”替换为“S_IRWXO”。它应该可以工作,虽然我不确定:)
-
@JoãoFernandes:试过了,但输出仍然只是:
Output:而不是 :Output:hello world!。也许还有其他想法?谢谢 -
您是否验证过您的信号量正在正确初始化,并且--once--,而不是每个进程一次?您的每个信号量操作的返回码是什么?
-
@SanJacinto:是的,我加倍检查了。它从零 (0) 开始,到 1,然后回到零。从不大于 1 或小于 0。
标签: c ipc pipe semaphore shared-memory