Действительно ли возможно использовать указатели функции через процессы?

Если Вы разрабатываете в соответствии с Linux, одним из лучших инструментов для этого (например, обнаруживаете утечки памяти, отслеживая выделения, сделанные в определенных местах кода), valgrind, особенно его инструмент горного массива. Единственный недостаток - то, что прогоны программы медленнее (или намного медленнее), таким образом, это только полезно для отладки.

7
задан Juliano 13 October 2009 в 17:25
поделиться

6 ответов

Нет. Все указатели на функцию - это адрес в адресном пространстве вашего процесса. У него нет внутреннего маркера, уникального для разных процессов. Таким образом, даже если указатель на функцию оказался действительным после того, как вы переместили его на B, он вызовет эту функцию от имени процесса B.

Например, если у вас есть

////PROCESS A////
int processA_myfun() { return 3; }
// get a pointer to pA_mf and pass it to process B

////PROCESS B////
int processB_myfun() { return 4; } // This happens to be at the same virtual address as pA_myfun
// get address from process A
int x = call_myfun(); // call via the pointer
x == 4;  // x is 4, because we called process B's version!

If process A и B запускают один и тот же код, вы можете получить идентичные функции по одинаковым адресам - но вы все равно будете работать со структурами данных B и глобальной памятью! Итак, краткий ответ: нет, это не то, как вы хотите это делать!

Кроме того, меры безопасности, такие как рандомизация разметки адресного пространства , могут помешать подобного рода "уловкам" когда-либо работать.

Вы путаете IPC и RPC. IPC предназначен для передачи данных, например, ваши объекты или кусок текста. RPC предназначен для запуска кода в удаленном процессе.

8
ответ дан 6 December 2019 в 10:01
поделиться

Короче говоря, вы не можете использовать указатель на функцию, который передан другому процессу.

Коды функций находятся на защищенных страницах памяти, вы не можете писать в них. И каждый процесс имеет изолированное виртуальное адресное пространство, поэтому адрес функции не действителен в другом процессе. В Windows вы можете использовать технику, описанную в этой статье, чтобы внедрить свой код в другой процесс, но последняя версия Windows отклоняет его.

Вместо передачи указателя на функцию вам следует подумать о создании библиотеки, которая будет используется в обоих процессах. В этом случае вы можете отправить сообщение другому процессу, когда вам нужно вызвать эту функцию.

8
ответ дан 6 December 2019 в 10:01
поделиться

Указатель на функцию для этого не работает, потому что он содержит только начальный адрес кода; если рассматриваемый код не существует в другом процессе или (из-за чего-то вроде рандомизации адресного пространства) находится в другом месте, указатель на функцию будет бесполезен; во втором процессе он будет указывать на что-то или ничего, но почти наверняка не туда, куда вы хотите.

Если бы вы были ненормальным, вы могли бы скопировать фактическую последовательность инструкций в общую память, а затем получить второй процесс переходит непосредственно к нему - но даже если бы вы могли заставить это работать, функция все равно выполнялась бы в процессе B, а не в процессе A.

Похоже, что вам действительно нужна система передачи сообщений или RPC .

1
ответ дан 6 December 2019 в 10:01
поделиться

Если бы вы пытались использовать указатель функции процесса A из процесса B, вы бы не вызывали процесс A - вы вызываете все, что находится по тому же адресу в процессе B. Если это одна и та же программа, вам может повезти, и это будет тот же код, но у него не будет доступа ни к каким данным, содержащимся в процессе А.

1
ответ дан 6 December 2019 в 10:01
поделиться

Вот почему люди изобретают разные вещи как COM, RPC и CORBA. Каждый из них дает такую ​​общую возможность. Как вы догадались, каждый выполняет свою работу немного иначе, чем другие.

Boost IPC на самом деле не поддерживает удаленные вызовы процедур. Это позволит поместить переменную в разделяемую память, чтобы она была доступна двум процессам, но если вы хотите использовать геттер / сеттер для доступа к этой переменной, вам придется сделать это самостоятельно.

все это в основном обертки для создания "аппетитного" версия чего-то, что вы можете обойтись без них. В Windows, например, вы можете самостоятельно поместить переменную в общую память. Вы можете сделать то же самое в Linux. Библиотека Boost - это довольно «тонкая» библиотека, которая позволяет вам писать один и тот же код для Windows или Linux, но не пытается много надстроить на этом. CORBA (например) - это более толстый слой, обеспечивающий относительно полную распределенную среду.

1
ответ дан 6 December 2019 в 10:01
поделиться

Если оба процесса находятся в одном приложении, это должно работать. Если вы пытаетесь отправить указатели функций между приложениями, тогда вам не повезло.

Мой первоначальный ответ был правильным, если вы предполагали, что процесс и поток - это одно и то же, а это не так. Другие ответы верны - разные процессы не могут совместно использовать указатели на функции (или любые другие указатели, если на то пошло).

0
ответ дан 6 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: