blob: abde75f6ebc118ec0613ca95de75113141ca53fc [file] [log] [blame]
#include "parent.h"
bool CreateProcesses()
{
#ifdef _MSC_VER
accessEvent = CreateEventA(NULL, FALSE, TRUE, ACCESS_EVENT);
char buff[3];
for (int i = 0; i < PROCESSCOUNT; i++)
{
_itoa(i, buff, 10);
buff[2] = '\0';
buff[1] = UP_EVENT;
upEvent[i] = CreateEventA(NULL, FALSE, FALSE, buff);
buff[1] = DOWN_EVENT;
downEvent[i] = CreateEventA(NULL, FALSE, FALSE, buff);
buff[1] = EXIT_EVENT;
exitEvent[i] = CreateEventA(NULL, FALSE, FALSE, buff);
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcessA(PATH,
_itoa(i, buff, 10),
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si[i],
&pi[i])
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
system("pause");
return false;
}
}
#else
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = synchandler;
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGHUP);
act.sa_mask = set;
sigaction(SIGHUP, &act, NULL);
for (int i = 0; i < PROCESSCOUNT; i++)
{
pid[i] = fork();
switch(pid[i]){
case 0:
{
if (!execl(PATH, "", NULL)){
printf("execl failed ");
return false;
}
break;
}
case -1:
{
return false;
}
default:
{
continue;
}
}
}
#endif
return true;
}
void PrintMenu(){
cout << "1. level up." << endl;
cout << "2. level lower." << endl;
cout << "3. exit." << endl;
cout << "4. skip." << endl;
}
void ShowMenu()
{
#ifdef _MSC_VER
DWORD check = WaitForSingleObject(accessEvent, INFINITY);
if (check == WAIT_OBJECT_0)
{
PrintMenu();
SetEvent(accessEvent);
}
#else
PrintMenu();
#endif
}
int ChooseMenu(int &inputNumber)
{
while (true){
if (!(cin >> inputNumber))
{
cin.clear();
cin.sync();
}
else if (inputNumber < 1 || inputNumber > 4){
cin.clear();
cin.sync();
}
else {
return inputNumber;
}
}
}
void WaitAndClose()
{
#ifdef _MSC_VER
for (int i = 0; i < PROCESSCOUNT; i++)
{
WaitForSingleObject(pi[i].hProcess, INFINITE);
CloseHandle(pi[i].hProcess);
CloseHandle(upEvent[i]);
CloseHandle(downEvent[i]);
CloseHandle(exitEvent[i]);
}
CloseHandle(accessEvent);
#else
for (int i = 0; i < PROCESSCOUNT; i++)
{
waitpid(pid[i], 0, 0);
}
#endif
}
int main()
{
if (!CreateProcesses())
{
return 1;
}
int inputNumber;
do {
ShowMenu();
ChooseMenu(inputNumber);
switch (inputNumber)
{
case 1: {
for (int i = 0; i < PROCESSCOUNT; i++)
{
#ifdef _MSC_VER
SetEvent(upEvent[i]);
#else
kill(pid[i], SIGUSR1);
#endif
}
break;
}
case 2:
{
for (int i = 0; i < PROCESSCOUNT; i++)
{
#ifdef _MSC_VER
SetEvent(downEvent[i]);
#else
kill(pid[i], SIGUSR2);
#endif
}
break;
}
case 3:
{
for (int i = 0; i < PROCESSCOUNT; i++)
{
#ifdef _MSC_VER
SetEvent(exitEvent[i]);
#else
kill(pid[i], SIGINT);
#endif
}
break;
}
default:
{
break;
}
}
#ifdef _MSC_VER
#else
if(inputNumber != 3)
{
for(int i = 0; i < PROCESSCOUNT; i++)
{
kill(pid[i], SIGHUP);
fl = true;
while (fl)
{
sleep(1);
}
}
}
#endif
} while (inputNumber != 3);
WaitAndClose();
return 0;
}