getppid返回的是原始父进程还是当前父进程?
关于Linux
getppid系统调用的返回值说明 getppid() 返回的是当前进程的当前父进程PID,而非创建该进程的原始父进程PID。
当原始父进程早于当前进程退出时,当前进程会成为孤儿进程,被系统对应的托管进程收养(默认是PID为1的init/systemd进程,部分场景下也可能是进程所属会话的领导者进程),此时getppid()的返回值会自动更新为收养它的新父进程的PID,和原始父进程的PID会存在差异。
注:仅当父进程彻底退出的场景下
getppid()返回值才会变更,父进程处于休眠、阻塞等非运行状态时,返回值依然为原始父进程PID。
你可以通过以下简单逻辑验证该特性:
- 父进程调用
fork()生成子进程后立刻退出 - 子进程sleep 2~3秒等待父进程退出完成,再调用
getppid()打印返回值 - 最终输出的PID不会是已经退出的原始父进程的PID,而是托管孤儿进程的父进程PID
内容的提问来源于stack exchange,提问作者rolen
相关产品推荐
相关产品推荐

