blob: 3a3f3731b6054f4932257b21f460c0941994612d [file] [log] [blame]
ArtHellb50b45c2016-04-18 23:36:58 +03001#ifdef _MSC_VER
2
3#define _CRT_SECURE_NO_WARNINGS
4#include <windows.h>
5
6#else
7
8#include <unistd.h>
9#include <sys/types.h>
10#include <semaphore.h>
11#include <signal.h>
12#include <cstring>
13#include <sys/wait.h>
14
15#endif
16
17#include <iostream>
18#include <stdio.h>
19#include <string>
20using namespace std;
21
22#ifdef _MSC_VER
23
24#define UP_EVENT 'U'
25#define DOWN_EVENT 'D'
26#define EXIT_EVENT 'E'
27#define ACCESS_EVENT "A"
28#define PATH "D:\\SystemProg\\labka2_spo_parent_lin\\Debug\\labka2_spo_child_lin.exe"
29
30#endif
31
32#define PROCESSCOUNT 9
33
34#ifdef _MSC_VER
35STARTUPINFOA si[PROCESSCOUNT];
36PROCESS_INFORMATION pi[PROCESSCOUNT];
37HANDLE upEvent[PROCESSCOUNT], downEvent[PROCESSCOUNT], exitEvent[PROCESSCOUNT], accessEvent;
38
39#else
40
41#define PATH "child"
42int pid[PROCESSCOUNT];
43bool fl;
44void synchandler(int p){
45 fl = false;
46}
47
48#endif
49
50bool CreateProcesses()
51{
52
53#ifdef _MSC_VER
54
55 accessEvent = CreateEventA(NULL, FALSE, TRUE, ACCESS_EVENT);
56 char buff[3];
57 for (int i = 0; i < PROCESSCOUNT; i++)
58 {
59 _itoa(i, buff, 10);
60 buff[2] = '\0';
61 buff[1] = UP_EVENT;
62 upEvent[i] = CreateEventA(NULL, FALSE, FALSE, buff);
63 buff[1] = DOWN_EVENT;
64 downEvent[i] = CreateEventA(NULL, FALSE, FALSE, buff);
65 buff[1] = EXIT_EVENT;
66 exitEvent[i] = CreateEventA(NULL, FALSE, FALSE, buff);
67
68 ZeroMemory(&si, sizeof(si));
69 ZeroMemory(&pi, sizeof(pi));
70
71 if (!CreateProcessA(PATH,
72 _itoa(i, buff, 10),
73 NULL,
74 NULL,
75 FALSE,
76 0,
77 NULL,
78 NULL,
79 &si[i],
80 &pi[i])
81 )
82 {
83 printf("CreateProcess failed (%d).\n", GetLastError());
84 system("pause");
85 return false;
86 }
87 }
88
89#else
90
91 struct sigaction act;
92 memset(&act, 0, sizeof(act));
93 act.sa_handler = synchandler;
94 sigset_t set;
95 sigemptyset(&set);
96 sigaddset(&set, SIGHUP);
97 act.sa_mask = set;
98 sigaction(SIGHUP, &act, NULL);
99 for (int i = 0; i < PROCESSCOUNT; i++)
100 {
101 pid[i] = fork();
102 switch(pid[i]){
103 case 0:
104 {
105 if (!execl(PATH, "", NULL)){
106 printf("execl failed ");
107 return false;
108 }
109 break;
110 }
111 case -1:
112 {
113 return false;
114 }
115 default:
116 {
117 continue;
118 }
119 }
120 }
121
122#endif
123
124 return true;
125}
126
127void ShowMenu()
128{
129
130#ifdef _MSC_VER
131
132 DWORD check = WaitForSingleObject(accessEvent, INFINITY);
133 if (check == WAIT_OBJECT_0)
134 {
135 cout << "1. Log level up." << endl;
136 cout << "2. Log level lower." << endl;
137 cout << "3. Exit." << endl;
138 cout << "4. Skip." << endl;
139 SetEvent(accessEvent);
140 }
141
142#else
143
144 cout << "1. Log level up." << endl;
145 cout << "2. Log level lower." << endl;
146 cout << "3. Exit." << endl;
147 cout << "4. Skip." << endl;
148
149#endif
150
151 return;
152}
153
154int ChooseMenu(int &inputNumber)
155{
156 while (true){
157 if (!(cin >> inputNumber))
158 {
159 cin.clear();
160 cin.sync();
161 }
162 else if (inputNumber < 1 || inputNumber > 4){
163 cin.clear();
164 cin.sync();
165 }
166 else {
167 return inputNumber;
168 }
169 }
170}
171
172void WaitAndClose()
173{
174
175#ifdef _MSC_VER
176
177 for (int i = 0; i < PROCESSCOUNT; i++)
178 {
179 WaitForSingleObject(pi[i].hProcess, INFINITE);
180 CloseHandle(pi[i].hProcess);
181 CloseHandle(upEvent[i]);
182 CloseHandle(downEvent[i]);
183 CloseHandle(exitEvent[i]);
184
185 }
186 CloseHandle(accessEvent);
187
188#else
189
190 for (int i = 0; i < PROCESSCOUNT; i++)
191 {
192 waitpid(pid[i], 0, 0);
193 }
194
195#endif
196
197}
198
199int main()
200{
201 if (!CreateProcesses())
202 {
203 return 0;
204 }
205
206 int inputNumber;
207
208 do {
209 ShowMenu();
210 ChooseMenu(inputNumber);
211 switch (inputNumber)
212 {
213 case 1: {
214 for (int i = 0; i < PROCESSCOUNT; i++)
215 {
216
217#ifdef _MSC_VER
218
219 SetEvent(upEvent[i]);
220
221#else
222
223 kill(pid[i], SIGUSR1);
224
225#endif
226
227 }
228 break;
229 }
230 case 2:
231 {
232 for (int i = 0; i < PROCESSCOUNT; i++)
233 {
234
235#ifdef _MSC_VER
236
237 SetEvent(downEvent[i]);
238
239#else
240
241 kill(pid[i], SIGUSR2);
242
243#endif
244 }
245 break;
246 }
247 case 3:
248 {
249 for (int i = 0; i < PROCESSCOUNT; i++)
250 {
251
252#ifdef _MSC_VER
253
254 SetEvent(exitEvent[i]);
255
256#else
257
258 kill(pid[i], SIGINT);
259
260#endif
261 }
262 break;
263 }
264 case 4:
265 {
266 break;
267 }
268 }
269#ifdef _MSC_VER
270
271#else
272
273 if(inputNumber != 3)
274 {
275 for(int i = 0; i < PROCESSCOUNT; i++)
276 {
277 kill(pid[i], SIGHUP);
278 fl = true;
279 while (fl)
280 {
281 sleep(1);
282 }
283 }
284 }
285
286#endif
287
288 } while (inputNumber != 3);
289
290 WaitAndClose();
291 return 0;
292}
293