在我的代码中,我进行了以下初始化:
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)。
谢谢
最佳答案
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
接口(interface)可以被任何类型的 IO 或其他信号中断。你总是要检查 这些函数的返回,特别是重新启动函数 如果它收到EINTR
.- 现代 C 有一个 bool 值。您可以通过包含轻松使用
<stdbool.h>
通过名字bool
,false
和true
.
关于c - 当两个进程试图访问一个信号量 = 0 的临界区时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708049/