@NikitaWeb

Как параллельно запустить программу?

Есть следующая задача:
Разработать программы в ОС 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);
}
  • Вопрос задан
  • 139 просмотров
Пригласить эксперта
Ответы на вопрос 1
Надо в коде первой программы прописать вызов exe файла второй, например через https://docs.microsoft.com/en-us/windows/win32/api...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы