Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠ½ΠΎΠ²ΡΡ Π·Π°Π΄Π°Ρ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 6.3 ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ Π·Π°Π΄Π°Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ Π²Π²Π΅ΡΡΠΈ ΠΎΠ΄Π½Ρ ΠΈΠ· ΡΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π»Ρ ΠΈΡ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ. Π ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½Π°Π±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ 6.4, 6.5 ΠΈ 6.6.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 6.3. JobShell: ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅, Π²ΡΠ²ΠΎΠ΄ ΡΠΏΠΈΡΠΊΠ° ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΎΠ½ΠΎΠ²ΡΡ Π·Π°Π΄Π°Ρ/* ΠΠ»Π°Π²Π° 6. */
/* JobShell.Ρ β ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ:
jobbg β ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ Π·Π°Π΄Π°ΡΡ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.
jobs β ΠΡΠ²Π΅ΡΡΠΈ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΡΠΎΠ½ΠΎΠ²ΡΡ Π·Π°Π΄Π°Ρ.
kill β ΠΡΠ΅ΠΊΡΠ°ΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ ΠΈΠ· ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° Π·Π°Π΄Π°Ρ.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΎΠΏΡΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ°Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ. */
#include "EvryThng.h"
#include "JobMgt.h"
int _tmain(int argc, LPTSTR argv[]) {
BOOL Exit = FALSE;
TCHAR Command[MAX_COMMAND_LINE + 10], *pc;
DWORD i, LocArgc; /* ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ argc. */
TCHAR argstr[MAX_ARG][MAX_COMMAND_LINE];
LPTSTR pArgs[MAX_ARG];
for (i = 0; i < MAX_ARG; i++) pArgs[i] = argstr[i];
/* ΠΡΠ²Π΅ΡΡΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΡΠΈΡΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π΅Π΅. */
_tprintf(_Π’("Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ Windows\n"));
while (!Exit) {
_tprintf(_T("%s"), _T("JM$"));
_fgetts(Command, MAX_COMMAND_LINE, stdin);
pc = strchr(Command, '\n');
*pc = '\0';
/* ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·Π±ΠΎΡ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ Ρ ΡΠ΅Π»ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ. */
GetArgs(Command, &LocArgc, pArgs); /* Π‘ΠΌ. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π. */
CharLower(argstr[0]);
if(_tcscmp(argstr[0], _T("jobbg")) == 0) {
Jobbg(LocArgc, pArgs, Command);
} else if(_tcscmp(argstr[0], _T("jobs")) == 0) {
Jobs(LocArgc, pArgs, Command);
} else if(_tcscmp(argstr[0], _T("kill")) == 0) {
Kill(LocArgc, pArgs, Command);
} else if(_tcscmp(argstr[0], _T("quit")) == 0) {
Exit = TRUE;
} else _tprintf(_T("Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. ΠΠΎΠ²ΡΠΎΡΠΈΡΠ΅ Π²Π²ΠΎΠ΄\n"));
}
return 0;
}
/* jobbg [ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ] ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°Ρ ΡΡΡΠΎΠΊΠ° [ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ²Π»ΡΡΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠΌΠΈ]
βΡ: ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π½ΠΎΠ²ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ.
-d: ΠΡΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π±Π΅Π· ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΅ΠΌΡ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ.
ΠΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π½Π΅ Π·Π°Π΄Π°Π½Ρ, ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅Ρ ΠΊΠΎΠ½ΡΠΎΠ»Ρ Ρ jobbg. */
int Jobbg(int argc, LPTSTR argv[], LPTSTR Command) {
DWORD fCreate;
LONG JobNo;
BOOL Flags[2];
STARTUPINFO Startup;
PROCESS_INFORMATION ProcessInfo;
LPTSTR targv = SkipArg(Command);
GetStartupInfo(&StartUp);
Options(argc, argv, _T("cd"), &Flags[0], &Flags[1], NULL);
/* ΠΡΠΎΠΏΡΡΡΠΈΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, Π΅ΡΠ»ΠΈ ΠΎΠ½ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ. */
if (argv[1][0] == '-') targv = SkipArg(targv);
fCreate = Flags[0] ? CREATE_NEW_CONSOLE : Flags [1] ? DETACHED_PROCESS : 0;
/* Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ Π·Π°Π΄Π°ΡΡ/ΠΏΠΎΡΠΎΠΊ. ΠΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ Π²Π²ΠΎΠ΄Π° Π½ΠΎΠΌΠ΅ΡΠ° Π·Π°Π΄Π°ΡΠΈ. */
CreateProcess(NULL, targv, NULL, NULL, TRUE, fCreate | CREATE_SUSPENDED | CREATE_NEW_PROCESS_GROUP, NULL, NULL, &StartUp, &ProcessInfo);
/* Π‘ΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠΌΠ΅Ρ Π·Π°Π΄Π°ΡΠΈ ΠΈ Π²Π²Π΅ΡΡΠΈ ID ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² "Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ " Π·Π°Π΄Π°ΡΠΈ. */
JobNo = GetJobNumber(&ProcessInfo, targv); /* Π‘ΠΌ. "JobMgt.h" */
if (JobNo >= 0) ResumeThread(ProcessInfo.hThread);
else {
TerminateProcess(ProcessInfo.hProcess, 3);
CloseHandle(ProcessInfo.hProcess);
ReportError(_T("ΠΡΠΈΠ±ΠΊΠ°: ΠΠ΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΠΌΠ΅ΡΡΠ° Π² ΡΠΏΠΈΡΠΊΠ΅ Π·Π°Π΄Π°Ρ."), 0, FALSE);
return 5;
}
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
_tprintf(_T(" [%d] %d\n"), JobNo, ProcessInfo.dwProcessId);
return 0;
}
/* jobs: Π²ΡΠ²ΠΎΠ΄ ΡΠΏΠΈΡΠΊΠ° Π²ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΡ ΡΡ ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ Π·Π°Π΄Π°Ρ. */
int Jobs(int argc, LPTSTR argv[], LPTSTR Command) {
if (!DisplayJobs ()) return 1; /*Π‘ΠΌ. ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ*/
return 0;
}
/* kill [ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ] ΠΠΎΠΌΠ΅Ρ Π·Π°Π΄Π°ΡΠΈ (JobNumber)
βb: ΠΠ΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Ctrl-Break.
βΡ: ΠΠ΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Ctrl-C.
Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°. */
int Kill(int argc, LPTSTR argv[], LPTSTR Command) {
DWORD ProcessId, JobNumber, iJobNo;
HANDLE hProcess;
BOOL CntrlC, CntrlB, Killed;
iJobNo = Options(argc, argv, _T("bc"), &CntrlB, &CntrlC, NULL);
/* ΠΠ°ΠΉΡΠΈ ID ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠ³ΠΎ Ρ Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ. */
JobNumber = _ttoi(argv [iJobNo]);
ProcessId = FindProcessId(JobNumber); /* Π‘ΠΌ. ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ. */
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
if (hProcess == NULL) { /* ID ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ. */
ReportError(_T("ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠΆΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ΠΎ.\n"), 0, FALSE);
return 2;
}
if (CntrlB) GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, ProcessId);
else if (CntrlC) GenerateConsoleCtrlEvent(CTRL_C_EVENT, ProcessId);
else TerminateProcess(hProcess, JM_EXIT_CODE);
WaitForSingleObject(hProcess, 5000);
CloseHandle(hProcess);
_tprintf(T("ΠΠ°Π΄Π°ΡΠ° [%d] ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½Π° ΠΈΠ»ΠΈ ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° \n"), JobNumber);
return 0;
}
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π° jobbg ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ Π² ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ Get JobNumber (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 6.4) Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½ΠΎΠΌΠ΅ΡΠ° Π·Π°Π΄Π°ΡΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π·Π°Π΄Π°ΡΠΈ ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Ρ Π½Π΅ΠΉ ΡΠ²ΡΠ·Π°Π½. ΠΡΠ»ΠΈ Π² ΡΠΈΠ»Ρ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΏΡΠΈΡΠΈΠ½ Π·Π°Π΄Π°ΡΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π°, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅ΡΡΡ. ΠΠ±ΡΡΠ½ΠΎ' Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ Π½ΠΎΠΌΠ΅Ρ Π·Π°Π΄Π°ΡΠΈ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ, ΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° Π·Π°Π΄Π°ΡΠΈ
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΡΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ. ΠΡΠ΅ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½Ρ Π² Π΅Π΄ΠΈΠ½ΡΠΉ ΡΠ°ΠΉΠ» JobMgt.c, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π²ΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ΅ΠΊΡΡΡ.
ΠΠ΅ΡΠ²Π°Ρ ΠΈΠ· Π½ΠΈΡ , ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 6.4, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ Get JobNumber. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΠΈΡ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π·Π°ΡΠΈΡΡ ΠΎΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ Π½Π΅ΠΏΡΠ΅Π΄Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ ΠΎΠ΄Π° Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π° ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ Π²ΡΡΠ°Π²Π»Π΅Π½Ρ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠΎΠΏΡΠΎΠ²ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½Π°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠΏΡΡΠΎΠΊ Π·Π°ΠΏΠΈΡΠΈ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ Π·Π° ΡΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 6.4. JobMgt: ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π½ΠΎΠ²ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅/* ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ. */
#include "EvryThng.h"
#include "JobMgt.h" /* ΠΠΈΡΡΠΈΠ½Π³ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π. */
void GetJobMgtFileName (LPTSTR);
LONG GetJobNumber(PROCESS_INFORMATION *pProcessInfo, LPCTSTR Command)
/* Π‘ΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠΌΠ΅Ρ Π·Π°Π΄Π°ΡΠΈ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈ Π²Π²Π΅ΡΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π½ΠΎΠ²ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ Π·Π°Π΄Π°ΡΠΈ. */
{
HANDLE hJobData, hProcess;
JM_JOB JobRecord;
DWORD JobNumber = 0, nXfer, ExitCode, FsLow, FsHigh;
TCHAR JobMgtFileName[MAX_PATH];
OVERLAPPED RegionStart;
if (!GetJobMgtFileName(JobMgtFileName)) return β1;
/* ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π² Π²ΠΈΠ΄Π΅ ΡΡΡΠΎΠΊΠΈ "\tmp\UserName.JobMgt" */
hJobData = CreateFile(JobMgtFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hJobData == INVALID_HANDLE_VALUE) return β1;
/* ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π²Π΅ΡΡ ΡΠ°ΠΉΠ» ΠΏΠ»ΡΡ ΠΎΠ΄Π½Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ Π·Π°ΠΏΠΈΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ°. */
RegionStart.Offset = 0;
RegionStart.OffsetHigh = 0;
RegionStart.hEvent = (HANDLE)0;
FsLow = GetFileSize(hJobData, &FsHigh);
LockFileEx(hJobData, LOCKFILE_EXCLUSIVE_LOCK, 0, FsLow + SJM_JOB, 0, &RegionStart);
__try {
/* Π§ΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π΄Π»Ρ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΡΡΠΎΠ³ΠΎ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°. */
while(ReadFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL) && (nXfer > 0)) {
if (JobRecord.ProcessId == 0) break;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, JobRecord.ProcessId);
if (hProcess == NULL) break;
if (GetExitCodeProcess(hProcess, &ExitCode) && (ExitCode != STILL_ACTIVE)) break;
JobNumber++;
}
/* ΠΠΈΠ±ΠΎ Π½Π°ΠΉΠ΄Π΅Π½ ΠΏΡΡΡΠΎΠΉ ΡΠ΅Π³ΠΌΠ΅Π½Ρ, Π»ΠΈΠ±ΠΎ ΠΌΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Π° ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠ΅Π³ΠΌΠ΅Π½Ρ. */
if (nXfer != 0) /* ΠΠ΅ ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°. Π Π΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°ΡΡ. */
SetFilePointer(hJobData, β(LONG)SJM_JOB, NULL, FILE_CURRENT);
JobRecord.ProcessId = pProcessInfo->dwProcessId;
_tcsnccpy(JobRecord.CommandLine, Command, MAX_PATH);
WriteFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL);
} /* ΠΠΎΠ½Π΅Ρ try-Π±Π»ΠΎΠΊΠ°. */
__finally {
UnlockFileEx(hJobData, 0, FsLow + SJM_JOB, 0, &RegionStart);
CloseHandle(hJobData);
}
return JobNumber + 1;
}
ΠΡΠ²ΠΎΠ΄ ΡΠΏΠΈΡΠΊΠ° ΡΠΎΠ½ΠΎΠ²ΡΡ Π·Π°Π΄Π°Ρ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 6.5 ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ DisplayJobs.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° 6.5. JobMgt: ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π°ΠΊΡΠΈΠ²Π½ΡΡ Π·Π°Π΄Π°ΡBOOL DisplayJobs(void)
/* ΠΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°ΠΉΠ» Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , ΡΠΎΠΎΠ±ΡΠΈΡΡ ΡΡΠ°ΡΡΡ Π·Π°Π΄Π°ΡΠΈ. */
{
HANDLE hJobData, hProcess;
JM_JOB JobRecord;
DWORD JobNumber = 0, nXfer, ExitCode, FsLow, FsHigh;