【发布时间】:2012-07-27 07:50:58
【问题描述】:
在我的代码中,我做了以下初始化:
struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL ,
.status1 = -10 , .status2 = -10 , .semaphoreFlag = FALSE };
int initPipe()
{
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)) // semaphore is initialized to 0
{
myPipe.init = TRUE;
}
else
perror ("initPipe");
}
return 1; // always successful
}
我可以有多个可以从main() 调用的进程(注意fork)。
谢谢
【问题讨论】:
-
您调用
fork()两次:一次在开始时,一次在 if 条件内 -
@knittl:好的,那有什么问题?这是故意的
-
你最终有 4 个进程(父子进程都再次 fork())。第二个 fork (
if(fork())) 的进程将分别拥有原始信号量的不同副本。 -
@knittl:
if中的fork负责输出,每次输出 1 个。如果我在那之前添加一个叉子,那么我应该期待2输出......或者不是? .... 是的,我知道他们会有 2 个副本,但即便如此,有时我只会得到1输出。!为什么? -
可能是竞争条件。未指定 fork 后的执行顺序。调用 fork 后任何地方都可能发生上下文切换,你永远不知道是先执行 child 还是 parent。
标签: c linux shared-memory semaphore