Рабочим названием платформы .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; }
Некоторое неудобство, связанное с необходимостью использовать одно и то же приложение, можно легко обойти, если разделяемый сегмент поместить в разделяемую библиотеку - тогда один и тот же образ библиотеки может быть подключен к разным приложениям, что позволит им обмениваться данными. В этом варианте надо только учитывать, что адреса, в которые будет помещена библиотека, в разных процессах могут отличаться.