为什么父进程id是1

转 : http://www.cnblogs.com/bastard/p/2664896.html

借用一段代码:

/*
 *  fork_test.c
 *  version 1
 *  Created on: 2010-5-29
 *      Author: wangth
 */
#include <unistd.h>
#include <stdio.h> 
int main () 
{ 
	pid_t fpid; //fpid表示fork函数返回的值
	int count=0;
	fpid=fork(); 
	if (fpid < 0) 
		printf("error in fork!"); 
	else if (fpid == 0) {
		printf("i am the child process, my process id is %d\n, my parent process's id is %d\n",getpid(),getppid()); 
		printf("我是爹的儿子\n");//对某些人来说中文看着更直白。
		count++;
	}
	else {
		sleep(3); #加上这一句就能看到子进程的父进程id。如果注释掉并且父进程先运行,子进程打印父进程的id就是1
		printf("i am the parent process, my process id is %d\n, my parent process's id is %d\n",getpid(),getppid()); 
		printf("我是孩子他爹\n");
		count++;
	}
	printf("统计结果是: %d\n",count);
	return 0;
}

如果父进程先于子进程结束,子进程打印父进程id就会是1.

加个sleep,让父进程的执行等一会子进程 ^__^

<think>好的,我现在需要回答用户关于父进程ID的概念和获取方法的问题。首先,我得确保自己准确理解父进程ID的定义。父进程ID指的是在操作系统中,每个进程都是由另一个进程创建的,创建者进程的ID就是被创建进程的父进程ID。这一点我记得没错,但需要确认一下是否所有操作系统都是如此,比如Windows和类Unix系统(如Linux)的处理方式是否有差异。 接下来,用户可能想知道如何获取父进程ID。不同编程语言有不同的方法,我需要举几个常见语言的例子,比如Python、C/C++、Java、PowerShell和Bash。例如,在Python中,可以使用os模块的getppid()函数,但要注意这个函数在Windows和Unix系统下的可用性。可能需要查阅文档确认,Python的getppid在Windows下是否有效。记得之前学的时候,Windows确实支持这个函数,但最好还是确认一下。 对于C/C++,在Unix-like系统中,可以通过getppid()函数,而在Windows中则需要使用Windows API,比如通过CreateToolhelp32Snapshot函数遍历进程快照来获取父进程ID。这部分可能需要详细说明步骤,因为涉及到API调用,用户可能需要具体的代码示例。 Java的情况比较特殊,因为标准的Java API没有直接提供获取父进程ID的方法。不过可以通过ManagementFactory获取运行时MXBean,然后解析进程信息,或者使用Java 9后的ProcessHandle API。需要检查Java版本的支持情况,确保信息准确。 在PowerShell中,可以使用Get-CimInstance查询Win32_Process类,然后过滤出当前进程的ParentProcessId。需要给出具体的命令示例,确保用户能够直接复制使用。 Bash环境下,可以通过ps命令结合-o ppid=选项来获取父进程ID,例如ps -p $$ -o ppid=,这里$$表示当前shell的进程ID,需要验证这个命令的正确性。 同时,要提到跨平台工具的注意事项,比如不同操作系统下命令或API的差异,以及可能需要的权限问题。例如,某些系统调用可能需要管理员权限才能获取其他进程的信息。 还需要考虑用户可能的应用场景,比如调试、进程管理、监控等,说明父进程ID的实际用途,比如在排查僵尸进程或分析进程关系时的重要性。 最后,生成相关问题,帮助用户深入理解。例如,如何获取子进程ID,跨平台获取进程信息的方法,父进程ID的实际应用案例,系统调用获取进程信息的原理等。 总结一下,回答的结构应该是先定义父进程ID,然后分语言介绍获取方法,注意事项,最后生成相关问题。需要确保每个步骤的准确性,必要时引用参考资料,比如用户提供的引用[1]中的方法,可能涉及Windows API的使用。</think>### 父进程ID的概念与获取方法 #### 一、父进程ID的定义 父进程ID(Parent Process ID, PPID)是操作系统进程管理中的核心概念。在类Unix系统(如Linux、macOS)和Windows系统中,**每个进程均由另一个进程创建**,发起创建动作的进程称为父进程,其ID即为子进程的PPID。例如: - Shell启动的程序的PPID通常是Shell进程的PID - 操作系统启动的第一个进程(如Linux的`init`或`systemd`)的PPID为0 #### 二、获取方法(分平台/语言) 1. **Python** ```python import os print("当前进程PID:", os.getpid()) # 获取自身PID print("父进程PPID:", os.getppid()) # 直接获取父进程ID ``` *注意:`os.getppid()`在Windows和Unix系统均有效(Python 3.2+)* 2. **C/C++** - **Unix-like系统**: ```c #include <unistd.h> pid_t ppid = getppid(); // 直接获取父进程ID ``` - **Windows系统**: ```cpp #include <windows.h> #include <tlhelp32.h> DWORD GetParentPID(DWORD pid) { PROCESSENTRY32 pe; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); pe.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot, &pe)) { do { if (pe.th32ProcessID == pid) { CloseHandle(hSnapshot); return pe.th32ParentProcessID; } } while (Process32Next(hSnapshot, &pe)); } CloseHandle(hSnapshot); return 0; // 获取失败 } ``` 3. **Java** ```java // Java 9+ 使用ProcessHandle ProcessHandle parent = ProcessHandle.current().parent().orElse(null); if (parent != null) { long ppid = parent.pid(); } // Java 8需通过MXBean解析(仅Unix可用) String name = ManagementFactory.getRuntimeMXBean().getName(); String pid = name.split("@")[0]; // 需调用本地命令获取PPID(如`ps -p $PID -o ppid=`) ``` 4. **PowerShell** ```powershell (Get-CimInstance Win32_Process -Filter "ProcessId=$PID").ParentProcessId ``` 5. **Bash** ```bash echo "父进程ID: $(ps -p $$ -o ppid=)" # $$表示当前shell的PID ``` #### 三、关键注意事项 1. **跨平台差异**: - Windows进程树独立性强,父进程终止后子进程可能由系统接管 - Unix-like系统严格维护进程树关系 2. **权限要求**: - 查询其他进程的PPID可能需要管理员权限(如Windows的`SeDebugPrivilege`) 3. **特殊PPID值**: - PPID=0表示内核级进程(如Linux的`swapper`) - PPID=1表示被`init/systemd`托管的孤儿进程 #### 四、典型应用场景 1. 进程关系可视化(如`pstree`命令) 2. 安全审计中追踪可疑进程来源 3. 守护进程检测自身是否被意外终止(通过监控父进程ID变化)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值