|
Linux, Простенький вопрос |
|
|
|
 |
Ответов
(1 - 11)
|
Apr 8 2008, 08:33
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(Макс_Мат @ Apr 8 2008, 11:18)  Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает? ...смотря в каком родстве процессы
|
|
|
|
|
Apr 8 2008, 12:27
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 21-03-07
Пользователь №: 26 378

|
Цитата(tag @ Apr 8 2008, 12:33)  ...смотря в каком родстве процессы  ни в каком. Два отдельных с++ файла.
|
|
|
|
|
Apr 8 2008, 19:40
|

Участник

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

|
Цитата(Макс_Мат @ Apr 8 2008, 11:18)  Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает? makc уже все сказал  Копайте в сторону shared memory, а для синхронизации семафоры. Или же откажитесь от отдельных процессов и сделайте все потоками, тогда не нужно никакого shared memory, а синхронизировать доступ к структурам можно с помощью мьютексов. А если процессы на разных машинах запущенны, то можно использовать разные RPC (remote procedure call) их много разных: CORBA, SOAP, DCOM - выбирайте по вкусу.
|
|
|
|
|
Apr 9 2008, 00:21
|
Частый гость
 
Группа: Свой
Сообщений: 76
Регистрация: 21-03-07
Пользователь №: 26 378

|
Спасибо, но беглое знакомство с shared memory показывает, что это все равно не совсем то, что нужно - адресовать нужно не область памяти, а некую структуру данных (struct{char*; int и т.д.}). Я попробовал сделать так: завел в ядре драйверок и в функции ioctl сделал два режима чтение и сохранение внутри драйвера указателя на такую структуру. т.е. смысл такой, что один процесс сохраняет в драйвере указатель на свою структуру, а второй его читает и следовательно получает доступ к этой структуре. Трассировка показывает, что второй процесс действительно получает верный указатель, но при попытке что-то считать из структуры операционка выдает "segmentation fault", т.е. как будто сама операционка блокирует доступ к памяти другого процесса. Что-то мне подсказывает, что это нормально
|
|
|
|
|
Apr 9 2008, 03:27
|

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

|
Цитата(Макс_Мат @ Apr 8 2008, 20:21)  Спасибо, но беглое знакомство с shared memory показывает, что это все равно не совсем то, что нужно - адресовать нужно не область памяти, а некую структуру данных (struct{char*; int и т.д.}). Похоже, что знакомство действительно было беглым.. Почитайте, все там можно делать. shmget() etc.. 2. Из разных процессов доступа к памяти друг друга нет. Период.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Apr 9 2008, 06:42
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561

|
Цитата(Макс_Мат @ Apr 8 2008, 16:27)  ни в каком. Два отдельных с++ файла. ...попробуйте shared memory
|
|
|
|
|
May 20 2008, 10:58
|

Участник

Группа: Свой
Сообщений: 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)... несколько примеров смотри а архиве
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|