Как правильно установить семафоры с моей программой из двух процессов?

Как правильно заставить 2-й процесс ждать 1-го процесса, чтобы записать коэффициенты в файл?

Моя задача — синхронизировать 2 процесса с помощью семафоров. 1-й процесс читает данные, записывает в файл, затем 2-й процесс читает эти данные и находит решение, которое затем записывает в файл, а затем 1-й процесс читает это решение из файла и выводит решение на консоль.

/Вот родительский файл:/

#include "stdafx.h"
const char* FIRST_SEMAPHORE = "Semaphore1";
const char* SECOND_SEMAPHORE = "Semaphore2";

const char* FIRST_PROCESS = "Lab2_first.exe";
const char* SECOND_PROCESS = "Lab2_second.exe";

int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO sInfo;
PROCESS_INFORMATION pInfo;

CreateSemaphore(NULL, 0, 1, (LPCWSTR) FIRST_SEMAPHORE);
CreateSemaphore(NULL, 0, 1, (LPCWSTR) SECOND_SEMAPHORE);

GetStartupInfo(&sInfo);

if(!CreateProcess(ConvertLPCSTRToLPWSTR(SECOND_PROCESS), NULL, NULL,
NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo))
{
printf("Second process failed: %d\n", GetLastError());
}

if(!CreateProcess(ConvertLPCSTRToLPWSTR(FIRST_PROCESS), NULL, NULL,
NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo))
{
printf("First process failed: %d\n", GetLastError());
}return 0;
}

/Вот процесс 1 (Lab2_first):/

#include "stdafx.h"#include "windows.h"
const char* FIRST_SEMAPHORE = "Semaphore1";
const char* SECOND_SEMAPHORE = "Semaphore2";

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE semaphore1, semaphore2;
semaphore1 = OpenSemaphore(EVENT_ALL_ACCESS, TRUE,
ConvertLPCSTRToLPWSTR(FIRST_SEMAPHORE));
semaphore2 = OpenSemaphore(EVENT_ALL_ACCESS, TRUE,
ConvertLPCSTRToLPWSTR(SECOND_SEMAPHORE));

Equation equation;
printf("Enter coefficients: ");
scanf("%d %d %d", &equation.a, &equation.b, &equation.c);

HANDLE file = CreateFile(ConvertLPCSTRToLPWSTR("equation"),
GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);

DWORD number = sizeof(equation);
LPDWORD numberOfBytesWritten = &number;
WriteFile(file, &equation, sizeof(equation), numberOfBytesWritten,
NULL);

printf("1: write to file");

ReleaseSemaphore(semaphore1, 1, NULL);
WaitForSingleObject(semaphore2, INFINITE);

ReadFile(file, &equation, sizeof(equation), numberOfBytesWritten,
NULL);

if(equation.hasSolution)
{
printf("Solution");
} else {
printf("No solution");
}

char data[10];
scanf("%s", data);
return 0;
}

/Вот второй процесс (Lab2_second):/

#include "stdafx.h"#include "windows.h"
const char* FIRST_SEMAPHORE = "Semaphore1";
const char* SECOND_SEMAPHORE = "Semaphore2";

int _tmain(int argc, _TCHAR* argv[])
{
HANDLE semaphore1, semaphore2;
semaphore1 = OpenSemaphore(EVENT_ALL_ACCESS, TRUE, `enter code
here`ConvertLPCSTRToLPWSTR(FIRST_SEMAPHORE));
semaphore2 = OpenSemaphore(EVENT_ALL_ACCESS, TRUE,
ConvertLPCSTRToLPWSTR(SECOND_SEMAPHORE));

WaitForSingleObject(semaphore1, INFINITE);

printf("2: read from file");

HANDLE file = CreateFile(ConvertLPCSTRToLPWSTR("equation"),
GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

Equation equation;
DWORD number = sizeof(equation);
LPDWORD numberOfBytesWritten = &number;
ReadFile(file, &equation, sizeof(equation), numberOfBytesWritten,
NULL);

// todo

equation.hasSolution = FALSE;
WriteFile(file, &equation, sizeof(equation), numberOfBytesWritten,
NULL);

ReleaseSemaphore(semaphore2, 1, NULL);

return 0;
}

Вопрос заключается в следующем: почему при запуске родительского процесса 2-й процесс не ждет, пока 1-й выпуск semaphore1 (то есть 2-й процесс не реагирует на WaitForSingleObject (semaphore1, INFINITE)), и считывает данные из файла с самого начала (это сбрасывается при запуске: 2-й процесс сразу отображает «2: чтение из файла»), но там ничего нет. Как правильно заставить 2-й процесс ждать 1-го процесса, чтобы записать коэффициенты в файл?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]