ya_maks 0 April 8, 2008 Posted April 8, 2008 · Report post Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает? Quote Share this post Link to post Share on other sites More sharing options...
makc 385 April 8, 2008 Posted April 8, 2008 · Report post Читайте http://fscked.org/writings/SHM/shm-5.html Quote Share this post Link to post Share on other sites More sharing options...
tag 0 April 8, 2008 Posted April 8, 2008 · Report post Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает? ...смотря в каком родстве процессы :) Quote Share this post Link to post Share on other sites More sharing options...
ya_maks 0 April 8, 2008 Posted April 8, 2008 · Report post ...смотря в каком родстве процессы :) ни в каком. Два отдельных с++ файла. Quote Share this post Link to post Share on other sites More sharing options...
nazim 0 April 8, 2008 Posted April 8, 2008 · Report post Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает? makc уже все сказал ;) Копайте в сторону shared memory, а для синхронизации семафоры. Или же откажитесь от отдельных процессов и сделайте все потоками, тогда не нужно никакого shared memory, а синхронизировать доступ к структурам можно с помощью мьютексов. А если процессы на разных машинах запущенны, то можно использовать разные RPC (remote procedure call) их много разных: CORBA, SOAP, DCOM - выбирайте по вкусу. Quote Share this post Link to post Share on other sites More sharing options...
ya_maks 0 April 9, 2008 Posted April 9, 2008 · Report post Спасибо, но беглое знакомство с shared memory показывает, что это все равно не совсем то, что нужно - адресовать нужно не область памяти, а некую структуру данных (struct{char*; int и т.д.}). Я попробовал сделать так: завел в ядре драйверок и в функции ioctl сделал два режима чтение и сохранение внутри драйвера указателя на такую структуру. т.е. смысл такой, что один процесс сохраняет в драйвере указатель на свою структуру, а второй его читает и следовательно получает доступ к этой структуре. Трассировка показывает, что второй процесс действительно получает верный указатель, но при попытке что-то считать из структуры операционка выдает "segmentation fault", т.е. как будто сама операционка блокирует доступ к памяти другого процесса. Что-то мне подсказывает, что это нормально :05: Quote Share this post Link to post Share on other sites More sharing options...
A. Fig Lee 0 April 9, 2008 Posted April 9, 2008 · Report post Спасибо, но беглое знакомство с shared memory показывает, что это все равно не совсем то, что нужно - адресовать нужно не область памяти, а некую структуру данных (struct{char*; int и т.д.}). Похоже, что знакомство действительно было беглым.. Почитайте, все там можно делать. shmget() etc.. 2. Из разных процессов доступа к памяти друг друга нет. Период. Quote Share this post Link to post Share on other sites More sharing options...
Harbour 0 April 9, 2008 Posted April 9, 2008 · Report post дык а структура что в космосе обитает ? создавайте ее в нужной области памяти - или пишем свой allocator для new или тупо memcpy(shmem_buf, &some_struct, sizeof(some_struct)); Quote Share this post Link to post Share on other sites More sharing options...
tag 0 April 9, 2008 Posted April 9, 2008 · Report post ни в каком. Два отдельных с++ файла. ...попробуйте shared memory Quote Share this post Link to post Share on other sites More sharing options...
ya_maks 0 April 10, 2008 Posted April 10, 2008 · Report post Да, и правда, спасибо за совет Quote Share this post Link to post Share on other sites More sharing options...
Nitrotoluol 0 May 20, 2008 Posted May 20, 2008 · Report post я вижу тут несколько вариантов межпроцессного взаимодействия можно использовать: 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 Quote Share this post Link to post Share on other sites More sharing options...
vshemm 0 May 20, 2008 Posted May 20, 2008 · Report post Через сокеты/пайпы данные будут копироваться, а через shared memory - нет, что эффективнее; однако, во втором случае потребуется глобальный примитив синхронизации. Quote Share this post Link to post Share on other sites More sharing options...