【发布时间】:2012-07-30 18:30:45
【问题描述】:
我的代码中有信号量问题。
这是我构建的结构:
struct PipeShm
{
// doesn't matter
sem_t *mutex;
int init;
// more fields
};
这里我初始化结构体:
struct PipeShm myPipe ;
myPipe.mutex = NULL;
myPipe.init = 0;
而且我使用了一种初始化方法:
int initMethod()
{
if (!myPipe.init)
{
myPipe.mutex = mmap (NULL, sizeof *myPipe.mutex, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (!sem_init (myPipe.mutex, 1, 0))
{
myPipe.init = TRUE;
}
else
perror ("initMethod");
}
return 1;
}
这是一个使用上述内容的简单 main :
int main()
{
int spd, pid, rb;
char buff[4096];
shm_pipe_init();
fork();
// more code goes here
return 0;
}
在fork(); 行中(如果我错了请纠正我)2 进程将
有两个不同的信号量,对吧?
如果是这样,我想制作一个全局信号量。那可能吗?
由于我的代码中存在同步问题,我怀疑主要原因是 每个创建的进程都有一个双信号量。
【问题讨论】:
-
@tbert:我不能使用它(我的意思是文件)
-
那么你可能想看看你的手册页,因为“man sem_init”把我带到了“sem_open”,它说“sem_open() 函数在命名信号量和进程之间建立连接”这看起来与您在这里尝试做的完全一样。
-
您创建和初始化信号量的代码看起来像是在尝试做正确的事情。您在使用信号量时遇到过具体问题吗?
-
@user315052: 是的,我的进程不断地相互运行,即使我使用信号量和锁定。我真的不知道是什么原因造成的,我尝试了无数次调试,但是nada。我唯一的结论是信号量不是在所有进程之间共享的,这使得所有的地狱刹车都松了……例如:当我
fork时,我没有得到2 outputs,而是得到一次2 outputs,另一次得到@987654331 @ -
我已经告诉过你关于同一主题的其他问题,你必须在共享段中也有
init字段,这不能那样工作。您必须在细分市场中拥有整个共享控制结构。你看到我的回答了吗? stackoverflow.com/questions/11708049/…