2012-04-28 2 views
0

У меня есть проблемы с вилкой и ее копией на системе записи. Я создам params.writersCount procesess и каждый из них должен получить свой внутренний идентификатор (от 1 до params.writersCount). Поэтому в дочернем я жду родительского процесса, который инициализирует внутренний идентификатор childs (авторы [i] = processId). Затем я могу вызвать scriptSimulation и передать контекстный адрес, как аргумент, потому что в context.id теперь правильный внутренний идентификатор для этого дочернего элемента, из-за копирования на систему записи (context.id = j + 1 заставит unix копировать страницу, поэтому каждый ребенок имеет затем собственную копию контекста со своим внутренним идентификатором). Но если я пытаюсь использовать context.id в функции writerSimulation, я получаю 0. Что я делаю неправильно?Вилка и общие страницы

for(int i = 0; i < params.writersCount; i++) 
{ 
    pid_t processId = fork(); 

    if(!processId) 
    { 
     srand((unsigned int)(seconds+getpid())); 
     while(!context.id) 
     { 
      for(int j = 0; j < params.writersCount; j++) 
      { 
       if(writers[j] == getpid()) 
       { 
        context.id = j+1; 
       } 
      } 
      struct timespec wait = {.tv_sec = 0, .tv_nsec = 500000}; 
      nanosleep(&wait, NULL); 
     } 
     int simError = writerSimulation(&context); 
     return simError; 
    } 

    writers[i] = processId; 
} 
+0

введите стандартный английский язык, в том числе столиц. – thb

ответ

0

Это не совсем ясно для меня, но это выглядит, как вы пытаетесь иметь родительский изменить массив писателей в ребенке. Это не будет работать. После вилки любые записи, которые родитель делает, не будут видны в дочернем элементе, так как копирование при записи применяется как к дочернему, так и к родительскому. Кроме того, использование нанослоя для ожидания не является даже отдаленно надежным. Простым способом общения с ребенком является открытие канала перед вилкой и использование этого для синхронизации и передачи данных. просто родитель должен записывать данные в трубу. Ребенок блокирует чтение, а не nano-sleep, поэтому синхронизация обеспечивается чтением.

+0

aaa, так что если копирование на запись относится к обоим, то эта программа не может работать, thx man – Krab

0

Вы не можете в дочернем режиме получить значение, назначенное родителем после вилки . Есть несколько вариантов:

  • Измените свой общий подход, так это не нужно - полагаться на информации, доступной до развилки или производном независимо в обоих родителей и ребенка после него.

  • Используйте средство -sockets межпроцессного взаимодействия, трубы, совместно используемой памяти, и т.д.

Смежные вопросы