У меня есть два вопроса о следующем коде:Почему объекты в родительских/дочерних процессах имеют одинаковые адреса?
Кодекса:
#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)
Вопрос:
Почему адр eses var
и sem
то же самое при печати от родительского и дочернего процессов? Я знаю, что дочерние процессы получают экземпляр содержимого пространства памяти родителя, но я думал, что процессы имеют отдельные и разные адресные пространства, и, следовательно, никакие переменные не будут находиться в одном и том же месте памяти, но этот вывод, как представляется, указывает на другое.
Вопрос:
Является ли этот код на самом деле синхронизации двух процессов? Я настроен скептически. Хотя я назвал sem_init
флагом pshared
отличным от нуля, снова кажется, что дочерний процесс должен получать копию семафора. Я не вижу механизма, с помощью которого sem
«разделяется» между родительским и дочерним процессом: семафор не назван, и я не понимаю, как еще семафор получает общий доступ между родительским и дочерним процессом. Я подозреваю, что каждый процесс просто приобретает и выпускает свою собственную «копию» семафора, но я не уверен.
спасибо.
«Это место размещения в разделяемой памяти зависит от вас». Правильно ли, что в моем примере кода «семя» не разделяется между родительским и дочерним процессом? Детский процесс '' sem' является просто копией - но отдельным объектом - родительского процесса '' sem'? – StoneThrow
@StoneThrow Это правда. Я предлагаю вам [прочитать о общей памяти POSIX] (http://man7.org/linux/man-pages/man7/shm_overview.7.html). –