在 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”)。它一定会在你死后收割你(~获取结果代码并清理)。
我搜索了很多,但我只能找到 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”)。它一定会在你死后收割你(~获取结果代码并清理)。