如何在Frends中从子进程获取父进程ID(无需逐个传参)
获取子进程的父进程ID(PPID)的非侵入式方法
不需要逐个修改调用子进程的父进程,子进程自己就能直接获取父进程ID,不同平台和编程语言都有对应的实现方式:
Linux/Unix 系统原生方案
- 系统调用直接获取:所有Unix-like系统都提供了获取PPID的系统调用,比如C语言里的
getppid(),子进程调用就能拿到父进程ID,完全不需要父进程传参。#include <stdio.h> #include <unistd.h> int main() { pid_t ppid = getppid(); printf("父进程ID: %d\n", ppid); // 这里添加你的记录逻辑 return 0; } - 读取/proc文件系统:Linux下每个进程的状态都存在
/proc/self/status里,直接读取这个文件的PPid字段就行,shell脚本里可以这么写:PPID=$(grep -oP 'PPid:\s+\K\d+' /proc/self/status) echo "父进程ID: $PPID"
Windows 系统方案
- 调用Windows API:Windows 8及以上可以直接用
GetParentProcessId(),低版本可以通过枚举进程快照获取:#include <windows.h> #include <tlhelp32.h> #include <stdio.h> DWORD GetParentProcessId(DWORD pid) { DWORD ppid = 0; HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (snapshot != INVALID_HANDLE_VALUE) { PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); if (Process32First(snapshot, &pe)) { do { if (pe.th32ProcessID == pid) { ppid = pe.th32ParentProcessID; break; } } while (Process32Next(snapshot, &pe)); } CloseHandle(snapshot); } return ppid; } int main() { DWORD pid = GetCurrentProcessId(); DWORD ppid = GetParentProcessId(pid); printf("父进程ID: %lu\n", ppid); return 0; }
跨平台编程语言方案
- Python:Unix直接用
os.getppid(),Windows用psutil库兼容,几行代码就能搞定:import os import psutil ppid = os.getppid() if hasattr(os, 'getppid') else psutil.Process().ppid() print(f"父进程ID: {ppid}") - Java:可以通过运行时信息结合系统命令获取,不用修改任何父进程代码:
import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.io.BufferedReader; import java.io.InputStreamReader; public class PPIDGetter { public static void main(String[] args) { RuntimeMXBean mxBean = ManagementFactory.getRuntimeMXBean(); long pid = Long.parseLong(mxBean.getName().split("@")[0]); String command; if (System.getProperty("os.name").toLowerCase().contains("win")) { command = String.format("wmic process where processid=%d get parentprocessid", pid); } else { command = String.format("ps -o ppid= -p %d", pid); } try { Process process = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { line = line.trim(); if (!line.isEmpty() && Character.isDigit(line.charAt(0))) { System.out.println("父进程ID: " + line); break; } } reader.close(); } catch (Exception e) { e.printStackTrace(); } } }
这些方法都是子进程主动获取PPID,完全不需要修改任何调用它的父进程,刚好解决你调用方太多改不过来的问题。
内容的提问来源于stack exchange,提问作者Athul Jk
相关产品推荐
相关产品推荐

