在 fork() 之前,用户创建的进程(如 Hello World)的父进程是什么?

What is the parent of a user created process, like Hello World, before fork()?

我搜索了很多,但我只能找到 fork() 之后父进程的信息。但是大约在 fork()?

之前

假设我为 Hello World 创建并 运行 一个 C 程序:

#include <stdio.h>
#include <sys/types>
#include <unistd.h>

int main()
{
    int PPID;
    PPID = getppid();
    printf("Hello, World!\n");

    return 0;
}

我最初的理解是任何给定进程的父进程(不是有意使用 fork() 作为子进程)将是 init,因此 PPID 将是 1。但是当我 运行 这给了我一个不同的数字(我知道这是我的系统所独有的)。所以这意味着这个程序有不同的父级。我可以接受,但我的问题是这个父进程是什么?不是 ID,而是它实际上是什么?换句话说,当你创建一个像 Hello World 这样的程序时,它 return 0 到什么进程?

parent 将是启动您的程序的任何进程 -- 通常是 shell,例如 bash,如果您从那里 运行 它,或者是您的程序的一部分如果您从那里启动桌面环境(如启动器或其他东西)。

您可以使用 pstree 查看系统上的整个进程树。这是我在 Xubuntu 18.04 上的当前树:

~$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─4*[dhclient]
        │                └─2*[{NetworkManager}]
        ├─Thunar───2*[{Thunar}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─acpid
        ├─agetty
        ├─atop
        ├─atopacctd
        ├─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─cron
        ├─cups-browsed───2*[{cups-browsed}]
        ├─cupsd
        ├─2*[dbus-daemon]
        ├─dbus-launch
        ├─gnome-keyring-d─┬─ssh-agent
        │                 └─3*[{gnome-keyring-d}]
        ├─iio-sensor-prox───2*[{iio-sensor-prox}]
        ├─irqbalance───{irqbalance}
        ├─2*[kerneloops]
        ├─lightdm─┬─Xorg───9*[{Xorg}]
        │         ├─lightdm─┬─sh─┬─ssh-agent
        │         │         │    └─xfce4-session─┬─applet.py───{applet.py}
        │         │         │                    ├─blueman-applet───3*[{blueman-applet}]
        │         │         │                    ├─evolution-alarm───5*[{evolution-alarm}]
        │         │         │                    ├─light-locker───3*[{light-locker}]
        │         │         │                    ├─nm-applet───3*[{nm-applet}]
        │         │         │                    ├─polkit-gnome-au───2*[{polkit-gnome-au}]
        │         │         │                    ├─update-notifier───3*[{update-notifier}]
        │         │         │                    └─2*[{xfce4-session}]
        │         │         └─2*[{lightdm}]
        │         └─2*[{lightdm}]
        ├─lvmetad
        ├─networkd-dispat───{networkd-dispat}
        ├─packagekitd───2*[{packagekitd}]
        ├─polkitd───2*[{polkitd}]
        ├─pulseaudio───5*[{pulseaudio}]
        ├─python3───2*[{python3}]
        ├─rsyslogd───3*[{rsyslogd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─snapd───16*[{snapd}]
        ├─systemd─┬─(sd-pam)
        │         ├─at-spi-bus-laun─┬─dbus-daemon
        │         │                 └─3*[{at-spi-bus-laun}]
        │         ├─at-spi2-registr───2*[{at-spi2-registr}]
        │         ├─dbus-daemon
        │         ├─dconf-service───2*[{dconf-service}]
        │         ├─evolution-addre─┬─evolution-addre───5*[{evolution-addre}]
        │         │                 └─4*[{evolution-addre}]
        │         ├─evolution-calen─┬─evolution-calen───19*[{evolution-calen}]
        │         │                 └─4*[{evolution-calen}]
        │         ├─evolution-sourc───3*[{evolution-sourc}]
        │         ├─gpg-agent
        │         ├─gvfs-afc-volume───3*[{gvfs-afc-volume}]
        │         ├─gvfs-goa-volume───2*[{gvfs-goa-volume}]
        │         ├─gvfs-gphoto2-vo───2*[{gvfs-gphoto2-vo}]
        │         ├─gvfs-mtp-volume───2*[{gvfs-mtp-volume}]
        │         ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
        │         ├─gvfsd─┬─gvfsd-dnssd───2*[{gvfsd-dnssd}]
        │         │       ├─gvfsd-http───2*[{gvfsd-http}]
        │         │       ├─gvfsd-network───3*[{gvfsd-network}]
        │         │       ├─gvfsd-trash───2*[{gvfsd-trash}]
        │         │       └─2*[{gvfsd}]
        │         ├─gvfsd-fuse───7*[{gvfsd-fuse}]
        │         ├─gvfsd-metadata───2*[{gvfsd-metadata}]
        │         ├─indicator-messa───3*[{indicator-messa}]
        │         ├─obexd
        │         ├─xfce4-notifyd───2*[{xfce4-notifyd}]
        │         └─xfconfd
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-resolve
        ├─systemd-timesyn───{systemd-timesyn}
        ├─systemd-udevd
        ├─terminator─┬─bash───pstree
        │            └─3*[{terminator}]
        ├─thermald───{thermald}
        ├─udisksd───4*[{udisksd}]
        ├─unattended-upgr───{unattended-upgr}
        ├─upowerd───2*[{upowerd}]
        ├─uuidd
        ├─whoopsie───2*[{whoopsie}]
        ├─wpa_supplicant
        ├─xfce4-panel─┬─panel-1-whisker───2*[{panel-1-whisker}]
        │             ├─panel-16-notifi───2*[{panel-16-notifi}]
        │             ├─panel-17-indica───2*[{panel-17-indica}]
        │             ├─panel-19-pulsea───2*[{panel-19-pulsea}]
        │             ├─panel-4-systray
        │             ├─panel-5-notific───2*[{panel-5-notific}]
        │             ├─panel-6-indicat───2*[{panel-6-indicat}]
        │             ├─panel-9-pulseau───2*[{panel-9-pulseau}]
        │             └─2*[{xfce4-panel}]
        ├─xfce4-power-man───2*[{xfce4-power-man}]
        ├─xfdesktop───2*[{xfdesktop}]
        ├─xfsettingsd─┬─xfce4-appfinder─┬─firefox─┬─Privileged Cont───21*[{Privileged Cont}]
        │             │                 │         ├─RDD Process───5*[{RDD Process}]
        │             │                 │         ├─2*[Web Content───24*[{Web Content}]]
        │             │                 │         ├─Web Content───28*[{Web Content}]
        │             │                 │         ├─Web Content───36*[{Web Content}]
        │             │                 │         ├─Web Content───25*[{Web Content}]
        │             │                 │         ├─Web Content───17*[{Web Content}]
        │             │                 │         ├─WebExtensions───21*[{WebExtensions}]
        │             │                 │         └─76*[{firefox}]
        │             │                 └─2*[{xfce4-appfinder}]
        │             └─2*[{xfsettingsd}]
        └─xfwm4───2*[{xfwm4}]

哦,如果你的 parent 死了,你会得到一个新的:init 进程(PID 1,现在在许多机器上称为“systemd”)。它一定会在你死后收割你(~获取结果代码并清理)。