| Рабочим названием платформы .NET было |
Взаимодействие процессов и потоков
Межпроцессное взаимодействие с использованием общих секций
Еще одна разновидность работы с разделяемыми данными посредством проецирования файлов связана с объявлением специальных разделяемых сегментов в приложении - такие сегменты будут общими для всех копий этого приложения. В своей основе такой способ является частным случаем проецирования - с той оговоркой, что проецируется исполняемый файл (или разделяемая библиотека) и управление проекциями осуществляется декларативным способом.
В Microsoft Visual C++ для объявления разделяемого сегмента и помещаемых в него данных используются директивы #pragma и _ _declspec, как показано в примере ниже:
/* FSEC.CPP */
#include <windows.h>
#define DEFAULT_SECURITY (LPSECURITY_ATTRIBUTES)NULL
#pragma section("SHRD_DATA",read,write,shared)
_ _declspec(allocate("SHRD_DATA")) int shared[ 256 ];
int main( int ac, char **av )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
int i;
memset( &si, 0, sizeof(si) );
memset( &pi, 0, sizeof(pi) );
si.cb = sizeof(si);
if ( ac != 2 || strcmp( av[1], "slave" ) ) {
for ( i = 0; i < 256; i++ ) shared[i] = 256-i;
/* первый экземляр с общими данными */
CreateProcess(
NULL, "fsec.exe slave", DEFAULT_SECURITY,
DEFAULT_SECURITY, FALSE, NORMAL_PRIORITY_CLASS,
NULL, NULL, &si, &pi
);
CloseHandle( pi.hThread );
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
} else {
/* второй экземляр с общими данными */
for ( i = 0; i < 256; i++ )
if ( shared[i] != 256-i ) break;
if ( i != 256 ) { /* ОШИБКА! */ }
}
return 0;
}Некоторое неудобство, связанное с необходимостью использовать одно и то же приложение, можно легко обойти, если разделяемый сегмент поместить в разделяемую библиотеку - тогда один и тот же образ библиотеки может быть подключен к разным приложениям, что позволит им обмениваться данными. В этом варианте надо только учитывать, что адреса, в которые будет помещена библиотека, в разных процессах могут отличаться.