Передача указателя процессу, порожденному exec () - PullRequest
1 голос
/ 09 марта 2009

Я хотел бы передать указатель (я помещаю файл с данными в память с помощью mmap) на процессы, порожденные с помощью fork + exec, но я застрял на том, как передать указатель на порожденный процесс exec ()?

Update1:

Спасибо за ваш вклад, я использую разделяемую память, создавая ее с помощью mmap с флагом MAP_INHERIT:

Каждый сопоставленный файл и область общей памяти, созданные с помощью функции mmap () не отображается при успешном вызове любой из функций exec, кроме регионы отображаются с помощью опции MAP_INHERIT. Регионы сопоставлены с Параметр MAP_INHERIT остается сопоставленным в новом образе процесса.

источник: http://www.uwm.edu/cgi-bin/IMT/wwwman?topic=exec(2)&msection=

UPDATE2:

Это домашнее задание, но я думаю, что должен перестать думать об указателях и думать о самом IPC. Я думаю, я пойду с попыткой отобразить тот же файл в дочернем процессе.

Пример короткого кода высоко ценится.

Заранее спасибо за помощь.

Ответы [ 6 ]

9 голосов
/ 09 марта 2009

Если вы используете разделяемую память, вы не можете передать указатель. Указатель будет содержать виртуальный адрес, который отличается от одного процесса к другому. Вы должны обмениваться значениями смещения, основываясь на начале области общей памяти.

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

1 голос
/ 09 марта 2009

Рассмотрите возможность передачи смещения в память в файле дочернему процессу. Если смещение равно нулю, не беспокойтесь, но если вам нужно передать «указатель» на часть пути через файл, преобразуйте его в смещение от начального адреса и передайте его потомку. Затем дочерний элемент может получить данные, добавив смещение к адресу, который он получает для сопоставленного файла.

1 голос
/ 09 марта 2009

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

В качестве альтернативы вы можете использовать boost :: interprocess, чтобы создать для вас сегмент общей памяти и фактически передать адрес (он может выполнять сопоставление). Вы сами читаете эту документацию: http://www.boost.org/doc/libs/1_38_0/doc/html/interprocess.html

1 голос
/ 09 марта 2009

Это не может работать. Новый процесс должен mmap и сам файл.

0 голосов
/ 18 марта 2009

Это большая территория, и у вас есть из чего выбирать.

Ключом к нахождению этих решений является поиск чего-то вроде межпроцессорного взаимодействия Linux или, возможно, Linux IPC .

Введение в IPC также можно найти в таких книгах, как Advance Linux Programming (ISBN: 0-7357-1043-0)

0 голосов
/ 09 марта 2009

Просто передайте текст в аргументе командной строки или в переменной окружения.

...