首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > windows >

Win核心编程功课章中PerJobUserTimeLimit的一些疑问

2012-10-21 
Win核心编程作业章中PerJobUserTimeLimit的一些疑问问题1:JOBOBJECT_BASIC_LIMIT_INFORMATION结构体中的Pe

Win核心编程作业章中PerJobUserTimeLimit的一些疑问
问题1:JOBOBJECT_BASIC_LIMIT_INFORMATION结构体中的PerJobUserTimeLimit的单位是100-ns,这个100-ns与秒的换算关系?

书上(P122)写的是 1秒 == 10000 (100-ns)
百度一下好像是: 1秒 = 1000毫秒(ms) = 1000 * 1000 微秒(μs) = 1000 * 1000 * 1000 纳秒(ns)

这样两种是有冲突的,到底是哪一个对(书上应该不会出现这种错误)

问题2:设置分配给作业对象的最大用户模式时间为 10000 (单位),在进程结束后,
使用GetProcessTimes获得用户模式下的时间却不是 10000 (单位), 这是为什么?



附代码:基本与书上一致

C/C++ code
#include "stdafx.h"void StartRestrictedProcess(){    //检查当前进程是否处于作业中    BOOL bInJob = FALSE;    IsProcessInJob(GetCurrentProcess(), NULL, &bInJob);    if (bInJob)    {        MessageBox(NULL, _T("当前进程已经在作业中"), NULL,MB_ICONINFORMATION | MB_OK);        return;    }    //创建作业对象    HANDLE hJob = CreateJobObject(NULL, _T("RestrictedProcessJob"));    //限制条件1    JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = { 0 };    jobli.PriorityClass = IDLE_PRIORITY_CLASS;    jobli.PerJobUserTimeLimit.QuadPart = 10000;    jobli.LimitFlags = JOB_OBJECT_LIMIT_PRIORITY_CLASS | JOB_OBJECT_LIMIT_JOB_TIME;    SetInformationJobObject(hJob, JobObjectBasicLimitInformation, &jobli, sizeof(jobli));    //2    JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;            //dword    jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE;            //没有限制    jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_EXITWINDOWS;    jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;    SetInformationJobObject(hJob, JobObjectBasicUIRestrictions, &jobuir, sizeof(jobuir));    //创建子进程    STARTUPINFO si = {sizeof(si)};    PROCESS_INFORMATION pi;    TCHAR szExe[] = _T("D:\\Program Files\\Microsoft Visual Studio 10.0\\Common7\\Tools\\spyxx.exe");    CreateProcess(NULL, szExe, NULL, NULL, FALSE, CREATE_SUSPENDED | CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);    //与作业关联    AssignProcessToJobObject(hJob, pi.hProcess);    ResumeThread(pi.hThread);    CloseHandle(pi.hThread);    //等待子进程返回    HANDLE h[2];    h[0] = pi.hProcess;    h[1] = hJob;    DWORD dw = WaitForMultipleObjects(2, h, FALSE, INFINITE);    switch (dw - WAIT_OBJECT_0)    {    case 0:        //子进程结束返回        break;    case 1:        //时间用完        break;    }    //获取进程相关的一些时间信息    FILETIME CreateTime;    FILETIME ExitTime;    FILETIME KernelTime;    FILETIME UserTime;    GetProcessTimes(pi.hProcess, &CreateTime, &ExitTime, &KernelTime, &UserTime);    TCHAR szInfo[MAX_PATH];    StringCchPrintf(szInfo, MAX_PATH, _T("Kernel = %u | User = %u\n"), KernelTime.dwLowDateTime / 10000, UserTime.dwLowDateTime / 10000);    MessageBox(GetActiveWindow(), szInfo, NULL, MB_OK | MB_ICONINFORMATION);    //关闭句柄    CloseHandle(hJob);    CloseHandle(pi.hProcess);}int _tmain(int argc, _TCHAR* argv[]){    StartRestrictedProcess();    return 0;}



运行结果:
+KernelTime{dwLowDateTime=625000 dwHighDateTime=0 }_FILETIME
+UserTime{dwLowDateTime=468750 dwHighDateTime=0 }_FILETIME

或者其它不同的结果
+KernelTime{dwLowDateTime=1093750 dwHighDateTime=0 }_FILETIME
+UserTime{dwLowDateTime=312500 dwHighDateTime=0 }_FILETIME



[解决办法]
纳秒的确是千分之一微秒的。但是你这里的是:-ns 前面那个负号是啥意思啊?这本书我没看过。不清楚

热点排行