ΠΡΠΈΠΌΠ΅Ρ: ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π°
ΠΠ°ΡΡΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡΡ Windows Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠΈ. ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° grepMP ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° Π² ΡΠ°ΠΉΠ»Π°Ρ , ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°ΠΉΠ». ΠΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈΡΡΠ΅Ρ UNIX-ΡΡΠΈΠ»ΠΈΡΡ grep, Ρ ΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ Π½Π°ΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΊ Π»ΡΠ±ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄. Π Π°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΊΠ°ΠΊ "ΡΠ΅ΡΠ½ΡΠΉ ΡΡΠΈΠΊ" ΠΈ ΡΡΠΈΡΠ°ΠΉΡΠ΅, ΡΡΠΎ ΠΎΠ½Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ.
ΠΠΎΠΌΠ°Π½Π΄Π½Π°Ρ ΡΡΡΠΎΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄:
grepMP ΡΠ°Π±Π»ΠΎΠ½ F1 F2 β¦ FN
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 6.1 Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΠΈΠ΄Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ:
β’ ΠΠ»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π²Ρ ΠΎΠ΄Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΎΡ F1 Π΄ΠΎ FN, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, Π·Π°ΠΏΡΡΠΊΠ°ΡΡΠΈΠΉ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ ΠΌΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ ΡΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°: grep ΡΠ°Π±Π»ΠΎΠ½ FK.
β’ ΠΠΎΠ»Ρ hStdOut ΡΡΡΡΠΊΡΡΡΡ STARTUPINFO Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΠΌΡΠΉ.
β’ ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠ΅Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΏΠΎΠΈΡΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ WaitForMultipleObjects.
β’ ΠΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΏΠΎΠΈΡΠΊΠ° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΠΉ Π²ΡΠ²ΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² (Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²). ΠΡΠ²ΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉ ΡΡΠΈΠ»ΠΈΡΡ cat (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 2.3).
β’ ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ WaitForMultipleObjects ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡΡ Π»ΠΈΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ MAXIMUM_WAIT_OBJECTS (64), ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ.
β’ ΠΠ»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠΈ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΠΎΠ΄ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° grep.
ΠΠΎΡΡΠ΄ΠΎΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ 6.1 ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅ΡΡΡ Π½Π° ΡΠΈΡ. 6.3.
Π ΠΈΡ. 6.Π. ΠΠΎΠΈΡΠΊ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° Π² ΡΠ°ΠΉΠ»Π°Ρ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
/* ΠΠ»Π°Π²Π° 6. grepMP. */
/* ΠΠ΅ΡΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ grep, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². */
#include "EvryThng.h"
int _tmain(DWORD argc, LPTSTR argv[])
/* ΠΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅, ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ. ΠΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ. */
{
HANDLE hTempFile;
SECURITY_ATTRIBUTES StdOutSA = /* ΠΡΡΠΈΠ±ΡΡΡ Π·Π°ΡΠΈΡΡ Π΄Π»Ρ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΠΌΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°. */
{sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
TCHAR CommandLine[MAX_PATH + 100];
STARTUPINFO StartUpSearch, Startup;
PROCESS_INFORMATION ProcessInfo;
DWORD iProc, ExCode;
HANDLE *hProc; /* Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΌΠ°ΡΡΠΈΠ² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². */
typedef struct {TCHAR TempFile[MAX_PATH];} PROCFILE;
PROCFILE *ProcFile; /* Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΌΠ°ΡΡΠΈΠ² ΠΈΠΌΠ΅Π½ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². */
GetStartupInfo(&StartUpSearch);
GetStartupInfo(&StartUp);
ProcFile = malloc((argc β 2) * sizeof(PROCFILE));
hProc = malloc((argc β 2) * sizeof(HANDLE));
/* Π‘ΠΎΠ·Π΄Π°ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ "grep". */
for (iProc = 0; iProc < argc β 2; iProc++) {
_stprintf(CommandLine, _T("%s%s %s"), _T("grep "), argv[1], argv[iProc + 2]);
GetTempFileName(_T("."), _T("gtm"), 0, ProcFile[iProc].TempFile); /* ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΏΠΎΠΈΡΠΊΠ°.*/
hTempFile = /* ΠΡΠΎΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΠΌΡΠΌ */
CreateFile(ProcFile[iProc].TempFile, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &StdOutSA, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
StartUpSearch.dwFlags = STARTF_USESTDHANDLES;
StartUpSearch.hStdOutput = hTempFile;
StartUpSearch.hStdError = hTempFile;
StartUpSearch.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
/* Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. */
CreateProcess(NULL, CommandLine, NULL, NULL, TRUE, 0, NULL, NULL, &StartUpSearch, &ProcessInfo);
/* ΠΠ°ΠΊΡΡΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ. */
CloseHandle(hTempFile);
CloseHandle(ProcessInfo.hThread);
hProc[iProc] = ProcessInfo.hProcess;
}
/* ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ Π²ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΈ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ . */
for (iProc = 0; iProc < argc β 2; iProc += MAXIMUM_WAIT_OBJECTS) WaitForMultipleObjects( /* Π Π°Π·ΡΠ΅ΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² */
min(MAXIMUM_WAIT_OBJECTS, argc β 2 β iProc), &hProc [iProc], TRUE, INFINITE);
/* ΠΠ΅ΡΠ΅ΡΠ»Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠΈΠ»ΠΈΡΡ cat */
for (iProc = 0; iProc < argc β 2; iProc++) {
if (GetExitCodeProcess(hProc[iProc], &ExCode) && ExCode==0) {
/* ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½ ΡΠ°Π±Π»ΠΎΠ½ β ΠΡΠ²Π΅ΡΡΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ. */
if (argc > 3) _tprintf(_T("%s:\n"), argv [iProc + 2]);
fflush(stdout); /* ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ²ΠΎΠ΄Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ. */
_stprintf(CommandLine, _T("%s%s"), _Π’("cat "), ProcFile[iProc].TempFile);
CreateProcess(NULL, CommandLine, NULL, NULL, TRUE, 0, NULL, NULL, &StartUp, &ProcessInfo);
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
}
CloseHandle(hProc [iProc]);
DeleteFile(ProcFile[iProc].TempFile);
}
free(ProcFile);
free(hProc);
return 0;
}
ΠΡΠΎΡΠ΅ΡΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅
Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ 6.1 ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΈ ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ (ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈ) ΠΏΠΎΡΠΎΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ , ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π²ΡΡ ΠΎΠ΄Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠΎΡΡΠΎΠΌΡ Π² SMP-ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ Windows ΠΌΠΎΠΆΠ΅Ρ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠ° Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°Ρ . Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π΅ΡΠ»ΠΈ ΠΎΡΠ΅Π½ΠΈΠ²Π°ΡΡ Π΅Π΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ²ΡΡΠ°Π΅ΡΡΡ, ΠΏΡΠΈΡΠ΅ΠΌ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Ρ Π²Π°ΡΠ΅ΠΉ ΡΡΠΎΡΠΎΠ½Ρ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
Π’ΠΈΠΏΠΈΡΠ½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π. ΠΠ²ΠΈΠ΄Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ ΡΡΠ΄Π° Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ²ΠΎΠ΄Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ² Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π½Π°Π»ΠΈΡΠΎ, ΠΈ ΡΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°Π΄Π°Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ.
ΠΠΌΠ΅ΡΡΠ΅ Ρ ΡΠ΅ΠΌ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°ΠΌ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ΅Π³Π΄Π° Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌ Π² ΡΠΎΠΌ, ΡΡΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΡ ΠΎΡΡΠ°ΡΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΌΠΈ ΠΈ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΈΠ½ΡΡ , ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°Π΄Π°Ρ. ΠΡΠΎ Π΄ΠΎΡΡΠΈΠ³Π°Π΅ΡΡΡ Π·Π° ΡΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΠ°ΡΠΊΠΈ ΡΠΎΠ΄ΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° (processor affinity mask) (ΡΠΌ. Π³Π»Π°Π²Ρ 9) Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ΅ Π·Π°Π΄Π°ΡΠΈ. ΠΠ±ΡΠ΅ΠΊΡΡ Π·Π°Π΄Π°Ρ (job objects) ΠΎΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ°Π·Π΄Π΅Π»ΠΎΠ² Π½Π°ΡΡΠΎΡΡΠ΅ΠΉ Π³Π»Π°Π²Ρ.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π²Π½ΡΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΈ Π΄Π»Ρ ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ² SMP Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ . Π‘Π²ΡΠ·Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΡΡΡ Π² Π³Π»Π°Π²Π΅ 7.
ΠΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°
ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π²ΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ GetProcessTimes, ΠΊΠΎΡΠΎΡΠ°Ρ Π² Windows 9x ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: ΠΈΡΡΠ΅ΠΊΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ (elapsed time), Π²ΡΠ΅ΠΌΡ, Π·Π°ΡΡΠ°ΡΠ΅Π½Π½ΠΎΠ΅ ΡΠ΄ΡΠΎΠΌ (kernel time), ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ (user time).
BOOL GetProcessTimes(HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime)
ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ»Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ, ΡΠ°ΠΊ ΠΈ Π½Π° ΠΏΡΠΎΡΠ΅ΡΡ, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΠ»ΠΎΡΡ. ΠΡΡΠΈΡΠ°Ρ Π²ΡΠ΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° (creation time) ΠΈΠ· Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° (exit time), ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΈΡΡΠ΅ΠΊΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅. Π’ΠΈΠΏ Π΄Π°Π½Π½ΡΡ FILETIME ΡΠ²Π»ΡΠ΅ΡΡΡ 64-Π±ΠΈΡΠΎΠ²ΡΠΌ; Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΡΠ°Π·Π½ΠΎΡΡΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΈΠΏ LARGE_INTEGER Π² ΡΡΡΡΠΊΡΡΡΡ ΡΠΈΠΏΠ° union. Π Π°Π½Π΅Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΌΠ΅ΡΠΎΠΊ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² Π±ΡΠ»ΠΎ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π² Π³Π»Π°Π²Π΅ 3 Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lsw.
Π€ΡΠ½ΠΊΡΠΈΡ GetThreadTimes Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ, Π½ΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΠΏΠΎΡΠΎΠΊΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π° Π³Π»Π°Π²Π° 7.
ΠΡΠΈΠΌΠ΅Ρ: Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
ΠΠ°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 6.2) ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ timep (ΠΎΡ time print β Π²ΡΠ²ΠΎΠ΄ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²), Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ UNIX-ΠΊΠΎΠΌΠ°Π½Π΄Π΅ time (ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° time ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄ΡΡΠ³ΠΎΠ΅ ΠΈΠΌΡ). ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠ²Π΅ΡΡΠΈ Π²ΡΠ΅ ΡΡΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Windows 9x Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π»ΠΈΡΡ ΠΈΡΡΠ΅ΠΊΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ· Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π²Π΅ΡΡΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠ· ASCII Π² Unicode, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ Π³Π»Π°Π²Π°Ρ .