Как заставить дочерние процессы изменять родительские переменные?

Я объявил массив:

char * words[1000] = {NULL};

И теперь у меня есть серия разветвленных дочерних процессов, добавляющих слова в этот массив, но они не влияют на родительскую программу. Как я могу это изменить?


person temporary_user_name    schedule 06.12.2012    source источник
comment
К вашему сведению, ваш первый блок кода можно упростить до char* words[1000] = {NULL};, и каждый элемент в массиве будет установлен на NULL.   -  person Cornstalks    schedule 06.12.2012
comment
Пожалуйста, никогда больше не пишите это: words[i][strlen(words[i])] = '\0';. Вы уже знаете, какова длина строки (от strlen(temp), поместите NUL в нужное место.   -  person Michael Foukarakis    schedule 06.12.2012
comment
Хм. Мне этот код кажется правильным: очистите массив указателей, затем каждый раз, когда вы хотите что-то вставить, ищите с начала, пока не найдете нулевой указатель, а затем займите это место. Итак, может быть, вы запускаете свой код инициализации каждый раз, когда что-то помещаете? Или ваш массив слов перезаписывается? Лучше всего, если вы разместите всю свою программу.   -  person pbhd    schedule 06.12.2012
comment
... потому что с каждым днем ​​он все дальше отдаляется от банки с краской.. Вы можете подумать о том, чтобы отслеживать, где находятся дыры в вашем столе, помимо сканирования.   -  person WhozCraig    schedule 06.12.2012
comment
@MichaelFoukarakis Я не знаю, как еще это написать.   -  person temporary_user_name    schedule 06.12.2012
comment
Просто замените первые три строки внутри if на words[i]=strdup (temp)   -  person pbhd    schedule 06.12.2012
comment
Дочерний и родительский процессы имеют разные адресные пространства, и вам нужно проделать дополнительную работу, чтобы они могли совместно использовать память. Существуют различные способы межпроцессного взаимодействия, разделяемая память скорее всего ты хочешь.   -  person Cornstalks    schedule 06.12.2012


Ответы (5)


Хм, для вашего случая редактирования: не используйте fork, используйте потоки, потому что тогда все работает в одном адресном пространстве ...
И, конечно же, затем используйте мьютексы для защиты вашего массива слов ...

person pbhd    schedule 06.12.2012
comment
Назначение школы. Нет выбора. - person temporary_user_name; 06.12.2012

вы не добавили блок if внутри блока while !!!

   while(i < 1000 && words[i] != NULL)
   {
   i++;
 if(i<1000){
    words[i] = (char*) malloc(strlen(temp)+1);
    strcpy(words[i], temp);
   words[i][strlen(words[i])] = '\0';
    printf("Added: %s at location %d\n", words[i], i);
   }
  }
person Debobroto Das    schedule 06.12.2012
comment
О нет, не то. Цикл while, который вы видите здесь, не является циклом while, который выполняется десять раз. Этот оператор if не должен находиться внутри цикла while. Предполагается, что цикл while найдет следующий открытый слот в массиве, а оператор if добавляет слово в этот слот, если i <1000, т.е. если массив не заполнен. - person temporary_user_name; 06.12.2012

Попробуйте это, у вас неправильные фигурные скобки:

int i = 0;
while(i < 1000 && words[i] != NULL){
    i++;
    if(i<1000){
        words[i] = (char*) malloc(strlen(temp)+1);
        strcpy(words[i], temp);
        words[i][strlen(words[i])] = '\0';
        printf("Added: %s at location %d\n", words[i], i);
    }
}
person Bobb Dizzles    schedule 06.12.2012

Пожалуйста, вставьте весь код ... Я написал код, чтобы делать то, что, как мне кажется, вы делаете, и у меня это сработало ...

    #include <stdio.h>

int main(int argc, char *argv[])
{
  char* words[1000];
  int j;
  for(j = 0; j<1000; j++)
    words[j] = NULL;
  char *temp = "dummy";

  for (j = 0; j < 10; j++)
    {
      int i = 0;
      while(i < 1000 && words[i] != NULL)
        i++;
      printf("Adding something to %d vs %d\n",i,j);
      if(i<1000){
        words[i] = (char*) malloc(strlen(temp)+1);
        strcpy(words[i], temp);
        words[i][strlen(words[i])] = '\0';
        printf("Added: %s at location %d\n", words[i], i);
      }
    }
}

/* prints:
Adding something to 0 vs 0
Added: dummy at location 0
Adding something to 1 vs 1
Added: dummy at location 1
Adding something to 2 vs 2
Added: dummy at location 2
Adding something to 3 vs 3
Added: dummy at location 3
Adding something to 4 vs 4
Added: dummy at location 4
Adding something to 5 vs 5
Added: dummy at location 5
Adding something to 6 vs 6
Added: dummy at location 6
Adding something to 7 vs 7
Added: dummy at location 7
Adding something to 8 vs 8
Added: dummy at location 8
Adding something to 9 vs 9
Added: dummy at location 9
*/
person Foon    schedule 06.12.2012
comment
Судя по вашему новому редактированию, похоже, что вам нужно использовать общую память. (Также вы можете просмотреть, например, заголовок stackoverflow.com/questions/7455161/, если вы не понимаете, ПОЧЕМУ вы видите поведение, которое видите (при условии, что вы используете fork, а не какой-то другой подход) - person Foon; 06.12.2012
comment
О, я понимаю, как это работает. Я просто пытаюсь убедиться, что то, что я пытаюсь сделать, невозможно. - person temporary_user_name; 06.12.2012
comment
Не то, чтобы я ожидал, что это поможет, но надеть мою седую бороду ... если бы вы работали на VxWorks 5.4 и использовали все, что они предоставляют, это форк, но не совсем, ваш код работал бы нормально (э-э ... все еще есть проблемы с специалисты по производительности) ... но fork под Unix (и связанными с ним) сделает это так, чтобы процесс A не мог легко связываться со своими дочерними / родительскими / двоюродными процессами. В противном случае «обедающие философы» стали бы колоть друг друга палочками для еды или чем-то в этом роде. - person Foon; 06.12.2012

когда вы создаете дочерний элемент с помощью fork, каждый дочерний элемент получает свою собственную копию массива, когда дочерний элемент что-то меняет в массиве, он фактически изменяет свою собственную копию, для того, что вы пытаетесь сделать, вам нужна межпроцессная связь (IPC), вам нужно создать разделяемую память или создайте канал, чтобы значения массива изменялись для всех дочерних и родительских

person Abdullah Amir    schedule 21.05.2020