【问题标题】:How to quit a running batch?如何退出正在运行的批处理?
【发布时间】:2019-05-16 21:46:15
【问题描述】:

考虑以下程序:

main(){system("start /b batch.bat");}

我想在程序稍后的某个时间终止批处理以及由它产生的任何进程 - 有什么想法吗?

【问题讨论】:

  • 不使用 system 而是使用 CreateProcessW 并将新进程分配给作业对象,最后调用 TerminateJobObject

标签: c windows batch-file winapi


【解决方案1】:

我想终止批处理以及它生成的任何进程

为此存在Job Objects

作业对象允许将进程组作为一个单元进行管理。

要终止当前与作业对象关联的所有进程,请使用 TerminateJobObject 函数。

if (HANDLE hJob = CreateJobObjectW(0, 0))
{
    WCHAR ApplicationName[MAX_PATH];
    if (GetEnvironmentVariableW(L"ComSpec", ApplicationName, RTL_NUMBER_OF(ApplicationName)))
    {
        PROCESS_INFORMATION pi;
        STARTUPINFOW si = { sizeof(si) };
        if (CreateProcessW(ApplicationName, L"cmd /c <some path>/batch.bat", 
                0, 0, 0, CREATE_SUSPENDED, 0, 0, &si, &pi))
        {
            if (AssignProcessToJobObject(hJob, pi.hProcess))
            {
                ResumeThread(pi.hThread);
            }
            else
            {
                TerminateProcess(pi.hProcess, 0);
            }
            CloseHandle(pi.hThread);
            CloseHandle(pi.hProcess);
        }
    }

    // .. wait for something ...
    TerminateJobObject(hJob, 0);
    CloseHandle(hJob);
}

但是,可以通过远程 com 调用(例如StartService)启动新进程——正式地从另一个进程启动。这当然不会在工作,也不会被终止

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多