有沒有辦法獲得子進程的PID?我的意思是,如果我使用CreateProcess打開一個cmd提示符,我知道它的PID,因爲我可以從返回的ProcessInformation結構中獲取它。但是,是否有可能獲得進程的PID,這些進程是從此命令提示符處打開的?如何獲取子進程的PID?
謝謝!
有沒有辦法獲得子進程的PID?我的意思是,如果我使用CreateProcess打開一個cmd提示符,我知道它的PID,因爲我可以從返回的ProcessInformation結構中獲取它。但是,是否有可能獲得進程的PID,這些進程是從此命令提示符處打開的?如何獲取子進程的PID?
謝謝!
可以使用CreateToolhelp32Snapshot
函數傳遞TH32CS_SNAPPROCESS
值,然後調用Process32First
方法,最後你必須遍歷返回的集合和比較th32ParentProcessID
字段的值對CMD.EXE的PID。另一種選擇是使用Win32_Process
WMI類使用ParentProcessId
屬性來過濾結果。
這個appraoch確實適用於統計目的。使用爲任何種類的IPC返回的PID都是不安全的,因爲PID來來去去,可能已被重用。 – alk
使用CreateJobObject創建作業並使用SetInformationJobObject將作業與I/O完成端口相關聯;有關更多詳情,請參閱JOBOBJECT_ASSOCIATE_COMPLETION_PORT。使用CREATE_SUSPENDED
創建流程並使用AssignProcessToJobObject將新流程作爲工作的一部分。
請記住,有時新的孫子進程在你看到進程ID時已經退出,並且該進程可以被重用。如果您使用OpenProcess獲取孫級進程的句柄,請確保正確處理錯誤,並且如果成功打開句柄,請確保您致電IsProcessInJob以驗證句柄是否確實指向其中一個孫級進程。
由於進程無法在Windows 8/2012之前嵌套,所以在創建子進程時可能需要使用CREATE_BREAKAWAY_FROM_JOB
標誌。
另一種方法是使用PsSetCreateProcessNotifyRoutine編寫一些內核模式代碼來實時監控所有進程創建。這在Vista和更高版本中因爲驅動程序簽名要求更麻煩,但對於XP,它可能是一個有用的選擇。 –
所以你實際上並不想要孩子的PID,而是來自** grand ** - 孩子的PID。 – alk
@alk:是的,確切的說就是我想要的。 – kampi