dushaoshuai / dushaoshuai.github.io

https://www.shuai.host
0 stars 0 forks source link

进程(Process) #54

Open dushaoshuai opened 1 year ago

dushaoshuai commented 1 year ago

进程,即运行中的程序,是程序执行时一种动态的表现。进程创建时,会被赋予一个 进程ID(process ID,PID)。

Bash 中的进程

Bash 中,pipeline 指用 ||& 连接起来的一个或多个命令,如,ls | wc。pipeline 中每个命令的输出输送给下一个命令,作为其输入。在 pipeline 中,每个命令都作为一个单独的进程运行(对于 pipeline 中的最后一个命令,可能不总是这样)在同一个进程组(process group)中。

进程组也称为 job,是 shell job control 的基础。Bash 为每个 pipeline 创建一个进程组,pipeline 中第一个命令的 进程ID 是这个进程组的 ID(process group ID),这个命令的进程也称为 process group leader,进程组中的进程有相同的 进程组ID。

所谓 job control,也就是进程组的管理。我们可以把一个 job 暂停在后台(通过 Control-Z),让一个 job 在后台运行(command &),让一个暂停在后台的 job 在后台恢复运行(通过 bg 命令),让一个后台的 job 在前台继续运行(通过 fg 命令)...

在进程组之上,还有 Session。Session 和进程组构成了进程的两层体系结构,同一个进程组中的进程都属于同一个 session。创建新 session 的进程称为 session leader,session leader 的 进程ID 就是这个 session 的 session ID。Session 中所有进程共享一个终端(controlling terminal)。

示例:

bash $ ls -l
total 3744
-rwxr-xr-x 1 shaouai shaouai 1839719 Feb 12 21:18 pipeline1.out
-rwxr-xr-x 1 shaouai shaouai 1987456 Feb 12 21:19 pipeline.out

bash $ ./pipeline1.out | ./pipeline.out | ./pipeline.out > /dev/null &
[1] 1580765

bash $ jobs -l
[1]+ 1580763 Running            ./pipeline1.out
     1580764                  | ./pipeline.out
     1580765                  | ./pipeline.out > /dev/null &

bash $ ps -o sid,pgid,pid,ppid,cmd --forest
    SID    PGID     PID    PPID CMD
1580405 1580405 1580405 1580403 -bash
1580405 1580763 1580763 1580405  \_ ./pipeline1.out
1580405 1580763 1580764 1580405  \_ ./pipeline.out
1580405 1580763 1580765 1580405  \_ ./pipeline.out
1580405 1580793 1580793 1580405  \_ ps -o sid,pgid,pid,ppid,cmd --forest

在这个例子中,我通过 & 操作符在后台运行了一个进程组,这个进程组有 3 个进程,进程组ID(1580763) 是 pipeline 中第一个命令的 进程ID,这第一个进程也就是 process group leader。可以看到,在这个终端中运行的进程都属于同一个 session,他们都有相同的 session ID(1580405),这个 ID 是 session leader -- bash 的 进程ID。

todo 补充其他资料

See also

Job Control Basics man 7 credentials man 1 top man 1 ps man 7 signal