.


:




:

































 

 

 

 





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) , , . - , . ' , , .





:


: 2015-09-20; !; : 453 |


:

:

80% - .
==> ...

1394 - | 1243 -


© 2015-2024 lektsii.org - -

: 0.013 .