Использование разделяемой памяти с fork () - PullRequest
7 голосов
/ 23 июня 2011

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

По сути, я пытаюсь запустить Odd-Even Sort с разветвлением, поэтому ребенок запускает шансы, а родитель запускает события.И то, и другое требует совместного использования вектора inputValues, а также логической сортировки.

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

while(!sorted)
{
    pID = fork();
    sorted = true;
    cout << "Sort set to TRUE." << endl;

    if(pID == 0)
    {
        int num = 1;
        cout << "Child swap run" << endl;
        Swap((void *) num);
        cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl;
        exit(0);
    }
    else if(pID < 0)
    {
        cout << "Failed to fork." << endl;
        exit(1);
    }
    else
    {
        wpid = waitpid(pID, &status, waitStatus);
        int num = 0;
        cout << "Parent swap run" << endl;
        Swap((void *) num);
        cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl;
    }
}

Я пробовал несколько способов взломать это разделение памяти, но не могу найти ни одного ресурса, который действительно объясняет, КАК это работает, что мне нужно, и лучший способ сделать это.

Итак, мои требования заключаются в следующем:

  • Родитель и ребенок должны иметь возможность совместно использовать глобальный вектор и управлять им, а также логический
  • Это должно быть в состояниидля запуска в цикле, как показано
  • Это должно работать с переменными, используемыми в main () и в функции swap ()

Если у вас есть какие-либо советы, я 'Буду очень признателен им.Спасибо!

1 Ответ

4 голосов
/ 23 июня 2011

Вам нужно будет использовать shmget() и shmat() для настройки объекта общей памяти, но, к сожалению, это не будет объект динамической памяти, такой как std::vector. Другими словами, вам нужно будет объявить весь размер объекта в точке инициализации объекта общей памяти. Хотя процесс довольно прост: в родительской программе вы вызовете shmget() с флагом IPC_CREAT, чтобы создать объект общей памяти и получить значение идентификатора для объекта. Затем вызовите shmat() со значением идентификатора, чтобы получить указатель на объект. Затем инициализируйте объект значениями по умолчанию. Когда вы переходите к своему дочернему процессу, указатель, возвращенный из shmat(), все равно будет действителен в дочернем процессе, поэтому вы можете совместно использовать память как родительского, так и дочернего процесса, используя одну и ту же переменную указателя.

Вы также захотите объявить в родительском процессе перед тем, как разветвить любого потомка семафором, используя sem_init() с атрибутом pshared, установленным в значение, большее 0. Тогда и родительский, и дочерний процессы могут использовать семафор для управления доступом к объекту общей памяти.

Опять же, имейте в виду, что объект разделяемой памяти не является динамическим объектом, поэтому вам нужно выделить для него достаточно места при его инициализации.

...