在我的代码中,我进行了以下初始化:
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 )。
谢谢
答案 0 :(得分:1)
AFAICS您的错误在您的控制变量中。只有您的mutex
变量在流程之间共享,而不是init
或flag
变量。这些是写入时的副本,因此您不会在不同的过程中看到更改。
您必须将所有控制变量打包到您创建的细分中。为您需要的所有字段创建适当的struct
类型。
mutex
真是个坏主意。互斥锁具有与信号量完全不同的语义。 (或者,如果你真的将它用作互斥锁,我没有检查,在初始值设定项中使用pthread_mutex_t
和pshared
。)
修改后修改:不,它不会像这样工作。您必须将整个struct
放在共享段中。因此,您的struct PipeShm
必须包含sem_t sem
而不是sem_t* mutex
。然后你会做类似
struct PipeShm * myPipe = 0;
int initPipe()
{
if (!myPipe->init)
{
myPipe = mmap (NULL, sizeof *myPipe, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (!sem_init (myPipe->sem, 1, 0)) // semaphore is initialized to 0
{
myPipe->init = true;
}
else
perror ("initPipe");
}
return 1; // always successful
}
您应该注意的其他事项:
sem_t
接口可以被任何类型的IO或其他信号中断。你总是要检查
返回这些功能,特别是重启功能
如果收到EINTR
。<stdbool.h>
名称为bool
,false
和true
。