这篇“Linux的shell与进程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux的shell与进程实例分析”文章吧。
这里先运行几个命令:
打印登陆进程(一直存在的,直到登陆退出)ID
george.guo@ls:~$ echo $PPID3411 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 #includeint 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/bashecho "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。
以上就是关于“Linux的shell与进程实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。