LINUX.ORG.RU

Общие файлы, mmap - чтение

 ,


0

1

Здравствуйте. Подскажите пожалуйста. Есть mmap, которая размещает файл в памяти, ускоряя доступ к нему. Необходимо организовать передачу между двумя процессами.

Пытаюсь сделать так:

 char *f;//область памяти куда поместим файл
    int com_size;//размер
    struct stat s;//структура для получения информации о файле

    pid_t proc;

    proc=fork();

    switch(proc)
    {
        case 0://дочерний процесс

        //ждем пока файл разместится в памяти
        sleep(2);
        fprintf(stderr, "get memory\n" );
        for (int i = 0; i < com_size; i++) 
        {
        char c;

        c = f[i];
        putchar(c);
        }

        break;
        default://родительский процесс

        //размещаем файл в памяти
         int fd;
         fd = open ("111", O_RDONLY);

            /* Get the size of the file. */
            int status;
            status = fstat (fd, & s);
            com_size = s.st_size;

            f = (char *) mmap (0, com_size, PROT_READ, MAP_SHARED, fd, 0);//размещаем файл

    }

получается, что адрес памяти доступен родителю, но потомку недоступен. Не совсем понимаю, как быть. Программа без форков работает нормально.


Просто открой и замапь файл в обоих процессах.

Не совсем понимаю, как быть

Начинай читать учебники.

tailgunner ★★★★★
()

У тебя в дочернем процессе char *f; указывает в никуда. Ты файл открываешь и мапишь память только в родительском.

grondek
()
Последнее исправление: grondek (всего исправлений: 1)

Сначала читай, потом форкай

MadMax
()
Ответ на: комментарий от tailgunner

А можно пример, где идет передача данных через общие файлы между процессами? Я может плохо искал, но находил примеры без fork()

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

А можно пример, где идет передача данных через общие файлы между процессами?

Для всего этого есть учебники. Стивенс для изнуряюще подробного изучения или Advanced Linux Programming, если по вершкам.

Я может плохо искал, но находил примеры без fork()

Потому что в данном случае fork не нужен. Передача данных через MAP_SHARED работает для независимых процессов.

tailgunner ★★★★★
()
Ответ на: комментарий от gwyllum

Для начала отдели котлеты от мух.

Научись организовывать работу между потомками.

http://www.intuit.ru/studies/courses/2192/31/info

А уже потом, прикрутишь mmap

А алгоритм будет таким:

  • Открыл, замепил файл.
  • Создал семафор.
  • Форкнулся и в путь.
AlexVR ★★★★★
()
Ответ на: комментарий от tailgunner

А зачем ему буть другим. Классика тут вполне проходит. Только нафига обмениваться данными между процессами через замепенный файл? Я ещё понимаю, если идёт параллельная запись в итоговый файл.

AlexVR ★★★★★
()
Ответ на: комментарий от AlexVR

А зачем ему буть другим.

Например, если нужно использовать уже существующий SysV семафор. Ну и в любом случае - зачем мапить файл в предке?

Только нафига обмениваться данными между процессами через замепенный файл?

Замапленный с MAP_SHARED файл - это просто разделяемая память.

tailgunner ★★★★★
()
Ответ на: комментарий от AlexVR

Создал семафор.

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

Форкнулся и в путь.

штука в том, что у меня есть два процесса(по заданию), которые друг о друге могут не знать, т.е. не обязательно родительский и дочерний. т.е. например процесс 1 порождает еще два процесса. процесс 2 получает информацию и теперь ему нужно обменяться с процессом 3 ей с помощью общих файлов. вот и получается, что в одном процессе я делаю mmap когда второй уже создан и ему недоступен адрес памяти куда помещается файл. Может я неправильно понял сам принцип общих файлов

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

Может я неправильно понял сам принцип общих файлов

This.

tailgunner ★★★★★
()
Ответ на: комментарий от asaw

В С++ это делается так:

Это делается не в С++ так, в апи либы. Когда же вы уже перестанете нести херню и начнёте отличать язык от стороннего api, сторонней реализации, а в данном случае обёртки.

Далее, mmap() - это тоже api, такой же как у тебя в бусте и он так же является ещё и крестовым.

TrueTsar1C
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.