現在、コマンドラインでpidを子に渡していますが、Win32 APIでこれを行う方法はありますか?あるいは、親が亡くなった場合、誰かが私が渡したpidがしばらくして別のプロセスに属する可能性があるという私の恐怖を和らげることができますか?
54503 次
5 に答える
55
他の誰かがこの質問に出くわし、コード サンプルを探している場合に備えて、私が取り組んでいる Python ライブラリ プロジェクトのために最近これを行う必要がありました。私が思いついたテスト/サンプルコードは次のとおりです。
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
int main(int argc, char *argv[])
{
int pid = -1;
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe = { 0 };
pe.dwSize = sizeof(PROCESSENTRY32);
//assume first arg is the PID to get the PPID for, or use own PID
if (argc > 1) {
pid = atoi(argv[1]);
} else {
pid = GetCurrentProcessId();
}
if( Process32First(h, &pe)) {
do {
if (pe.th32ProcessID == pid) {
printf("PID: %i; PPID: %i\n", pid, pe.th32ParentProcessID);
}
} while( Process32Next(h, &pe));
}
CloseHandle(h);
}
于 2009-02-17T18:58:42.370 に答える
22
これを行うためのより良い方法は、呼び出しDuplicateHandle()
て、プロセス ハンドルの継承可能な複製を作成することです。次に、子プロセスを作成し、コマンド ラインでハンドル値を渡します。 Close
親プロセスで複製されたハンドル。Close
子が完了したら、そのコピーも必要になります。
于 2009-06-11T03:07:53.577 に答える
21
ULONG_PTR GetParentProcessId() // By Napalm @ NetCore2K
{
ULONG_PTR pbi[6];
ULONG ulSize = 0;
LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle, ULONG ProcessInformationClass,
PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength);
*(FARPROC *)&NtQueryInformationProcess =
GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQueryInformationProcess");
if(NtQueryInformationProcess){
if(NtQueryInformationProcess(GetCurrentProcess(), 0,
&pbi, sizeof(pbi), &ulSize) >= 0 && ulSize == sizeof(pbi))
return pbi[5];
}
return (ULONG_PTR)-1;
}
于 2010-06-29T00:27:33.757 に答える
13
親プロセスが終了した場合、PID が別のプロセスに再利用される可能性が非常に高いことに注意してください。これは標準の Windows 操作です。
したがって、親の ID を受け取り、それが本当にあなたの親であることを確認したら、ハンドルを開いてそれを使用する必要があります。
于 2008-10-08T23:10:15.883 に答える
3
「代わりに、親プロセスが死亡した場合、渡した pid がしばらくして別のプロセスに属している可能性があるという私の恐怖を誰かが和らげることができますか?」
はい、PID は再利用できます。UNIX とは異なり、Windows は強力な親子関係ツリーを維持しません。
于 2008-10-08T23:09:55.883 に答える