Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Linux
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
Макс_Мат
Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает?
makc
Читайте http://fscked.org/writings/SHM/shm-5.html
tag
Цитата(Макс_Мат @ Apr 8 2008, 11:18) *
Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает?


...смотря в каком родстве процессы smile.gif
Макс_Мат
Цитата(tag @ Apr 8 2008, 12:33) *
...смотря в каком родстве процессы smile.gif


ни в каком. Два отдельных с++ файла.
nazim
Цитата(Макс_Мат @ Apr 8 2008, 11:18) *
Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает?


makc уже все сказал wink.gif
Копайте в сторону shared memory, а для синхронизации семафоры.
Или же откажитесь от отдельных процессов и сделайте все потоками, тогда не нужно никакого shared memory, а синхронизировать доступ к структурам можно с помощью мьютексов.
А если процессы на разных машинах запущенны, то можно использовать разные RPC (remote procedure call) их много разных: CORBA, SOAP, DCOM - выбирайте по вкусу.
Макс_Мат
Спасибо, но беглое знакомство с shared memory показывает, что это все равно не совсем то, что нужно - адресовать нужно не область памяти, а некую структуру данных (struct{char*; int и т.д.}). Я попробовал сделать так: завел в ядре драйверок и в функции ioctl сделал два режима чтение и сохранение внутри драйвера указателя на такую структуру. т.е. смысл такой, что один процесс сохраняет в драйвере указатель на свою структуру, а второй его читает и следовательно получает доступ к этой структуре. Трассировка показывает, что второй процесс действительно получает верный указатель, но при попытке что-то считать из структуры операционка выдает "segmentation fault", т.е. как будто сама операционка блокирует доступ к памяти другого процесса. Что-то мне подсказывает, что это нормально 05.gif
A. Fig Lee
Цитата(Макс_Мат @ Apr 8 2008, 20:21) *
Спасибо, но беглое знакомство с shared memory показывает, что это все равно не совсем то, что нужно - адресовать нужно не область памяти, а некую структуру данных (struct{char*; int и т.д.}).


Похоже, что знакомство действительно было беглым.. Почитайте, все там можно делать.

shmget() etc..

2. Из разных процессов доступа к памяти друг друга нет. Период.
Harbour
дык а структура что в космосе обитает ? создавайте ее в нужной области памяти - или пишем свой allocator для new или тупо memcpy(shmem_buf, &some_struct, sizeof(some_struct));
tag
Цитата(Макс_Мат @ Apr 8 2008, 16:27) *
ни в каком. Два отдельных с++ файла.

...попробуйте shared memory
Макс_Мат
Да, и правда, спасибо за совет
Nitrotoluol
я вижу тут несколько вариантов межпроцессного взаимодействия можно использовать:
1. Сокеты
2. Неименованые каналы
что-то типа
Код
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
int main (int argc, char * argv[])
{ int pipedes[2];
pid_t pid;
pipe(pipedes);
pid = fork();
if ( pid > 0 ) {
char *str = "String passed via pipe\n";
close(pipedes[0]);
write(pipedes[1], (void *) str, strlen(str) + 1);
close(pipedes[1]);
} else {
char buf[1024];
int len;
close(pipedes[1]);
while ((len = read(pipedes[0], buf, 1024)) != 0)
write(2, buf, len);
close(pipedes[0]);
}
return 0;
}


3. Именованные каналы(см. в сторону http://linux.die.net/man/3/mkfifo)

...

несколько примеров смотри а архиве
vshemm
Через сокеты/пайпы данные будут копироваться, а через shared memory - нет, что эффективнее; однако, во втором случае потребуется глобальный примитив синхронизации.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.