【问题标题】:C++ get child process id from parent process idC++从父进程id获取子进程id
【发布时间】:2017-05-23 11:37:30
【问题描述】:

在 Windows 10 中,如果我首先创建一个打开 calc.exe 的进程,它会触发 calc.exe,然后退出该进程,然后它会打开calculator.exe。我怎样才能获得在任务管理器中显示的实际进程 ID。 我正在使用以下代码来创建进程并显示进程 ID

if(!CreateProcess(("C:\\WINDOWS\\system32\\calc.exe"),
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&startup_info,
&pi) )
{
 args.GetReturnValue().Set(Nan::New(response).ToLocalChecked());
}
else
{

int dwPid = GetProcessId(pi.hProcess);
int v = dwPid->Int32Value();
args.GetReturnValue().Set(dwPid);
}

【问题讨论】:

  • 使用 fork() 方法
  • 另外,您希望dwPid->Int32Value() 做什么?变量dwPid 已经是int 值。作为原始类型的值,它没有成员函数。而且它绝对不是指针。
  • 您创建进程A 执行进程B 并退出。你问如何得到PIDB。我们可以枚举进程并将PROCESSENTRY32.th32ParentProcessIDPIDa 进行比较(不需要关闭A 进程的句柄以保持它PIDa)- 这样我们就得到了PIDb。但是如果B exec C 然后也退出怎么办。实际计算是 C 还是 A 实际计算?
  • 这正是CreateProcess的作用所做的!调用CreateProcess的进程将成为父进程,而新进程是子进程。并且子进程与父进程分开运行。所以我看不出问题出在哪里。也许它与CreateProcess 函数无关,但与其他东西有关?就像例如如何将值“返回”给 Node?​​span>
  • 据我所记得(从之前想要枚举进程子进程的问题),进程/系统不跟踪子进程(进程的),只有进程的父进程。你会 - 我认为 - 必须枚举进程 ID 并将父进程追回你想要的那个(这可能是 PS 脚本所做的)但你必须在 CALC.EXE 终止之前这样做(由此时间将与您的流程无关)。

标签: c++ visual-c++ windows-10 createprocess


【解决方案1】:
#include <iostream>
#include <vector>

#include <cstring>

#include <windows.h>
#include <tlhelp32.h>

using std::vector;
using std::cout;
using std::endl;

vector<DWORD> pids_from_ppid(DWORD ppid) {
  vector<DWORD> pids;
  HANDLE hp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  PROCESSENTRY32 pe = { 0 };
  pe.dwSize = sizeof(PROCESSENTRY32);
  if (Process32First(hp, &pe)) {
    do {
      if (pe.th32ParentProcessID == ppid) {
        pids.push_back(pe.th32ProcessID);
      }
    } while (Process32Next(hp, &pe));
  }
  CloseHandle(hp);
  return pids;
}

int main(int argc,char *argv[]) {
  if (arc >= 2) {
    DWORD ppid = (DWORD)strtoul(argv[1], nullptr, 10);
    vector<DWORD> pidVec = pids_from_ppid(ppid);
    for (int i = 0; i < pidVec.size(); i++) {
      cout << pidVec[i] << endl;
    }
  }
  return 0;
}

【讨论】:

  • 为什么要把所有的 id 都放到一个字符串中,然后将其拆分成一个字符串向量,然后再将单个字符串转换为 long?
  • 老实说,我不知道我为什么这样做。现在更正我的代码。
猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
相关资源
最近更新 更多