Jump to content
    

Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает?

Share this post


Link to post
Share on other sites

Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает?

 

...смотря в каком родстве процессы :)

Share this post


Link to post
Share on other sites

Подскажите плз, задачка такая (вроде бы простая): есть два процесса, в одном есть некая структура данных. как из другого процесса получить к ней доступ и попользовать? Кто что думает?

 

makc уже все сказал ;)

Копайте в сторону shared memory, а для синхронизации семафоры.

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

А если процессы на разных машинах запущенны, то можно использовать разные RPC (remote procedure call) их много разных: CORBA, SOAP, DCOM - выбирайте по вкусу.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

 

shmget() etc..

 

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

Share this post


Link to post
Share on other sites

дык а структура что в космосе обитает ? создавайте ее в нужной области памяти - или пишем свой allocator для new или тупо memcpy(shmem_buf, &some_struct, sizeof(some_struct));

Share this post


Link to post
Share on other sites

я вижу тут несколько вариантов межпроцессного взаимодействия можно использовать:

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

Share this post


Link to post
Share on other sites

Через сокеты/пайпы данные будут копироваться, а через shared memory - нет, что эффективнее; однако, во втором случае потребуется глобальный примитив синхронизации.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...