Есть следующая задача:
Разработать программы в ОС Windows для двух отдельных процессов, использующих общую память. Второй процесс запускается как дочерний для выполняемой первой программы. В первой программе должна создаваться разделяемая память и семафор для взаимодействия между процессами. Во второй открывается доступ к этой же разделяемой памяти и семафору. Первая программа, запустив второй процесс, должна после задержки в 10 - 15 секунд записать какой-то текст в разделяемую память и указать его готовность с помощью семафора, а вторая программа должна вначале прочитать текстовую информацию из того места разделяемой памяти, где она должна появиться и выдать полученную информацию на экран с примечанием о существе действия, затем перейти к ожиданию разрешающего значения семафора и только после его завершения выдать на экран содержимое из разделяемой памяти с соответствующим примечанием. Вместо семафора в Windows можно использовать событие или мьютекс. Обе программы должны после получения действующего указателя на область общей памяти вывести адрес этой области в консольное окно с соответствующими пояснениями. Первая программа после формирования данных для второго процесса, закрывает для себя доступ к разделяемой памяти. Далее она должна запросить 1000 байтов дополнительной памяти, никак не связанной с бывшей разделяемой, и используемой ею через другой или другие указатели. Дополнительно запрашиваемая память создается с помощью универсальной функции VirtualAlloc. Программа (первая) должна записать в эту область памяти, начиная с ее начала, сколько возможно символов латинского алфавита, записывая эти символы, пропуская по 399 свободных байтов (т.е. записывая 'a' в байт с нулевым смещением этой области памяти, затем 'b' в байт со смещением 400, далее 'c' в байт со смещением 800 и т.д., выполняя такое продвижение на 400 байтов по крайнем мере 15 раз). Каждую такую запись байта сопровождать детальным сообщением о действии и числовым значением адреса, по которому размещается этот байт в памяти.
Есть две программы, которые должны выполнить эту задачу, но
как параллельно запустить вторую программу?
Первая:
#include <windows.h>
#include <stdio.h>
#include <string.h>
void main()
{
int i,l;
HANDLE s,h;
char *buffer;
char buf[]="abcdefghijklmno";
char tow[]="Text, writed to memory";
if ((h=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,"mem"))==NULL)
{
printf("Can't create file mapping\n");
}
printf("Handle: %d\n",h);
if ((buffer=MapViewOfFile(h,FILE_MAP_WRITE | FILE_MAP_READ,0,0,1024))==NULL)
{
printf("Can't MapViewOfFile\n");
}
s=CreateMutex(NULL,1,"sem");
Sleep(10000);
printf("Write to buffer first time\n");
for (i=0;i<strlen(tow)+1;i++) buffer[i]=tow[i];
if (ReleaseMutex(s)) {printf("Release mutex\n");}
printf("From buffer: %s\n",buffer);
printf("Write to buffer second time\n");
for (i=0;i<3;i++)
{
printf("Writed: %c\n",buf[i]);
buffer[i*400]=buf[i];
}
Sleep(10000);
CloseHandle(s);
CloseHandle(h);
}
Вторая:
#include <windows.h>
#include <stdio.h>
#include <string.h>
void main()
{
int i,l;
HANDLE s,h;
char *buffer;
char tow[]="Text, writed to memory";
if ((h=OpenFileMapping(FILE_MAP_WRITE,0,"mem"))==NULL)
{
printf("Can't create file mapping\n");
}
printf("Handle: %d\n",h);
if ((buffer=MapViewOfFile(h,FILE_MAP_WRITE | FILE_MAP_READ,0,0,1024))==NULL)
{
printf("Can't MapViewOfFile\n");
}
printf("Readed from buffer first time: %s\n",buffer);
if ((s=OpenMutex(MUTEX_ALL_ACCESS,0,"sem"))==NULL)
{
printf("Can't open mutex\n");
}
WaitForSingleObject(s,INFINITE);
printf("Readed from buffer second time: %s\n",buffer);
ReleaseMutex(s);
CloseHandle(s);
CloseHandle(h);
}