共计 1281 个字符,预计需要花费 4 分钟才能阅读完成。
导读 | shell 和进程的关系:我们从 login shell 说起,login shell 用于表示登陆进程,是指用户刚登录系统时,由系统创建,用以运行 shell 的进程。 |
这里先运行几个命令:
打印登陆进程(一直存在的,直到登陆退出)ID
george.guo@ls:~$ echo $PPID
3411
george.guo@ls:~$ ps -aux | grep 3411
george.+ 3411 0.0 0.0 99004 4520 ? S 11:00 0:00 sshd: george.guo@pts/46
打印登陆进程 fork 出的 shell 进程(一直存在的,直到登陆退出)
george.guo@ls:~$ echo $$
3412
george.guo@ls:~$ ps -aux | grep 3412
george.+ 3412 0.5 0.0 21380 5120 pts/46 Ss 11:00 0:00 -bash
从上面的几个命令可以看出:
登陆进程 ID 是 3411,它创建了 bash shell 子进程 3412。以后的脚本执行,
3412 我们这里称为主 shell,它会启动子 shell 进程处理脚本。
(注:在 bash 中,子 shell 进程的 PID 存储在一个特殊的变量‘$$’中,PPID 存储子 shell 父进程的 ID。)
我们写两个小程序验证下:
george.guo@ls:~$ cat yes.c
#include
#include
#include <sys/types.h>
#include
int main()
{
pid_t pid;
pid_t ppid;
pid = getpid();
ppid = getppid();
system("./test"); //system will fork a process for exec ./test
printf("yes pid = %d, yes ppid = %d\n", pid, ppid);
}
george.guo@ls:~$ cat test
#!/bin/bash
echo "PID of this script: $$"
echo "test's PPID(system's fork id) = $PPID"
echo "tests's pid = $$"
运行结果如下:
george.guo@ls~$ ./yes
PID of this script: 6082
tests PPID(system's fork id)= 6081
echo tests self pid is 6082
yes PID = 6080, yes PPID = 3412
可见 yes 进程的父进程 ID 是 3412,即登陆进程 fork 的 bash shell 子进程,主 shell。这是因为
yes 是由主 shell 执行的。yes 进程 ID 是 6080,调用 system, fork 出子 shell ID 为 6081。
对于 system 调用:
使用 system() 运行命令需要创建至少两个进程。一个用于运行 shell ( 这里其 ID 为 6081),
另外一个或多个则用于 shell 所执行的命令 (这里是一个子 shell,就是脚本 test 本身).
脚本 test 本身进程 ID 为 6082。
正文完
星哥玩云-微信公众号