Опубликован: 28.06.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный технический университет им. Н.Э. Баумана
Лекция 14:

Взаимодействие процессов и потоков

Межпроцессное взаимодействие с использованием общих секций

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

В 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;
}

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

Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было
Bogdan Drumov
Bogdan Drumov
Молдова, Республика
Azamat Nurmanbetov
Azamat Nurmanbetov
Киргизия, Bishkek