видимость данных в другой общей библиотеке в Linux - PullRequest
0 голосов
/ 01 сентября 2011

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

Редактировать: Сэто только на стадии разработки, «реального кода» нет.

в общей библиотеке A:

void process()
{
 msg_ptr =  new message();
 send(msg_ptr); //send the msg address to library B
}

в общей библиотеке B:

void process()
{
 recv(msg_ptr); // at this point how can library B access the msg address
}

1 Ответ

1 голос
/ 01 сентября 2011

(Правка): Хорошо, вопрос несколько сбивает с толку, поскольку send и recv подразумевают межпроцессное взаимодействие, и, похоже, это не так, поэтому:

Краткий ответ: Да, не имеет значения, какая библиотека, статическая или динамическая, выполняет распределение. Это всегда для всего процесса.

Совместно используемая библиотека означает, что код хранится на диске один раз, но ничего не означает (что повлияет на использование) во время выполнения.

Распределение не имеет значения, делается ли оно из библиотеки или из кода приложения. У каждого процесса есть только одна куча, из которой он выполняет все выделения. Эта куча доступна для всего кода, запущенного в контексте этого процесса, и никогда не доступна для любого другого процесса (даже если используется тот же код). Фактически, сам operator new живет в другой общей библиотеке (libstdc++.so) и просто вызывает malloc из еще одной общей библиотеки (libc.so). И каждая общая библиотека появляется только один раз в каждом процессе, даже если от нее зависит более одной общей библиотеки (в некоторых случаях это может отличаться в Windows).

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

...