реклама на сайте
подробности

 
 
> Linux, Простенький вопрос
Макс_Мат
сообщение Apr 8 2008, 07:18
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 21-03-07
Пользователь №: 26 378



Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
makc
сообщение Apr 8 2008, 08:26
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Читайте http://fscked.org/writings/SHM/shm-5.html


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
tag
сообщение Apr 8 2008, 08:33
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



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


...смотря в каком родстве процессы smile.gif
Go to the top of the page
 
+Quote Post
Макс_Мат
сообщение Apr 8 2008, 12:27
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 21-03-07
Пользователь №: 26 378



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


ни в каком. Два отдельных с++ файла.
Go to the top of the page
 
+Quote Post
nazim
сообщение Apr 8 2008, 19:40
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 9-01-06
Из: Баку, Азербайджан
Пользователь №: 12 978



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


makc уже все сказал wink.gif
Копайте в сторону shared memory, а для синхронизации семафоры.
Или же откажитесь от отдельных процессов и сделайте все потоками, тогда не нужно никакого shared memory, а синхронизировать доступ к структурам можно с помощью мьютексов.
А если процессы на разных машинах запущенны, то можно использовать разные RPC (remote procedure call) их много разных: CORBA, SOAP, DCOM - выбирайте по вкусу.
Go to the top of the page
 
+Quote Post
Макс_Мат
сообщение Apr 9 2008, 00:21
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 21-03-07
Пользователь №: 26 378



Спасибо, но беглое знакомство с shared memory показывает, что это все равно не совсем то, что нужно - адресовать нужно не область памяти, а некую структуру данных (struct{char*; int и т.д.}). Я попробовал сделать так: завел в ядре драйверок и в функции ioctl сделал два режима чтение и сохранение внутри драйвера указателя на такую структуру. т.е. смысл такой, что один процесс сохраняет в драйвере указатель на свою структуру, а второй его читает и следовательно получает доступ к этой структуре. Трассировка показывает, что второй процесс действительно получает верный указатель, но при попытке что-то считать из структуры операционка выдает "segmentation fault", т.е. как будто сама операционка блокирует доступ к памяти другого процесса. Что-то мне подсказывает, что это нормально 05.gif
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Apr 9 2008, 03:27
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(Макс_Мат @ Apr 8 2008, 20:21) *
Спасибо, но беглое знакомство с shared memory показывает, что это все равно не совсем то, что нужно - адресовать нужно не область памяти, а некую структуру данных (struct{char*; int и т.д.}).


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

shmget() etc..

2. Из разных процессов доступа к памяти друг друга нет. Период.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Harbour
сообщение Apr 9 2008, 04:48
Сообщение #8


Местами Гуру
*****

Группа: Validating
Сообщений: 1 103
Регистрация: 5-12-04
Пользователь №: 1 323



дык а структура что в космосе обитает ? создавайте ее в нужной области памяти - или пишем свой allocator для new или тупо memcpy(shmem_buf, &some_struct, sizeof(some_struct));
Go to the top of the page
 
+Quote Post
tag
сообщение Apr 9 2008, 06:42
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(Макс_Мат @ Apr 8 2008, 16:27) *
ни в каком. Два отдельных с++ файла.

...попробуйте shared memory
Go to the top of the page
 
+Quote Post
Макс_Мат
сообщение Apr 10 2008, 15:24
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 21-03-07
Пользователь №: 26 378



Да, и правда, спасибо за совет
Go to the top of the page
 
+Quote Post
Nitrotoluol
сообщение May 20 2008, 10:58
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 33
Регистрация: 20-05-08
Из: Украина
Пользователь №: 37 661



я вижу тут несколько вариантов межпроцессного взаимодействия можно использовать:
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)

...

несколько примеров смотри а архиве
Прикрепленные файлы
Прикрепленный файл  linapi2.tar.gz ( 1.23 килобайт ) Кол-во скачиваний: 35
 
Go to the top of the page
 
+Quote Post
vshemm
сообщение May 20 2008, 16:29
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803



Через сокеты/пайпы данные будут копироваться, а через shared memory - нет, что эффективнее; однако, во втором случае потребуется глобальный примитив синхронизации.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 05:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.07539 секунд с 7
ELECTRONIX ©2004-2016