【发布时间】:2017-02-09 08:32:47
【问题描述】:
我对以下代码有两个问题:
守则:
#include <unistd.h>
#include <semaphore.h>
#include <iostream>
int main(int argc, char **argv)
{
sem_t sem;
int var = 0;
/* create, initialize semaphore */
if( sem_init(&sem,1,1) < 0)
{
perror("semaphore initilization");
exit(0);
}
int pid = fork();
static const size_t loopLen = 5;
if (0 == pid)
{ /* child process */
for (size_t i = 0; i < loopLen; ++i)
{
sem_wait(&sem);
std::string str("Child");
std::cout << str << " process: &var(" << (void*)(&var) << ") var(" << var++ << ") &sem(" << (void*)(&sem) << ")" << std::endl;
sem_post(&sem);
}
}
else
{ /* parent process */
for (size_t i = 0; i < loopLen; ++i)
{
sem_wait(&sem);
std::string str("Parent");
std::cout << str << " process: &var(" << (void*)(&var) << ") var(" << var++ << ") &sem(" << (void*)(&sem) << ")" << std::endl;
sem_post(&sem);
}
}
}
输出:
Parent process: &var(0xffffcbdc) var(0) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(0) &sem(0xffffcbe0)
Parent process: &var(0xffffcbdc) var(1) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(1) &sem(0xffffcbe0)
Parent process: &var(0xffffcbdc) var(2) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(2) &sem(0xffffcbe0)
Parent process: &var(0xffffcbdc) var(3) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(3) &sem(0xffffcbe0)
Parent process: &var(0xffffcbdc) var(4) &sem(0xffffcbe0)
Child process: &var(0xffffcbdc) var(4) &sem(0xffffcbe0)
问题:
为什么父进程和子进程打印时var和sem的地址是一样的?我知道子进程获得父内存空间内容的副本,但我认为进程具有独立且不同的地址空间,因此没有变量会位于同一内存位置 - 但是这个输出似乎另有说明。
问题:
这段代码实际上是在同步这两个进程吗?我持怀疑态度。尽管我使用非零标志 sem_init 调用了 sem_init,但似乎子进程应该获得信号量的副本。我没有看到sem 在父进程和子进程之间“共享”的机制:信号量没有命名,我不明白信号量是如何在父进程和子进程之间共享的。我怀疑每个进程只是简单地获取和释放它自己的信号量“副本”,但我不确定。
谢谢。
【问题讨论】: