这篇“Linux的shell与进程实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux的shell与进程实例分析”文章吧。

这里先运行几个命令:

打印登陆进程(一直存在的,直到登陆退出)ID

george.guo@ls:~$echo$PPID3411george.guo@ls:~$ps-aux|grep3411george.+34110.00.0990044520?S11:000:00sshd:george.guo@pts/46

打印登陆进程fork出的shell进程(一直存在的,直到登陆退出)

george.guo@ls:~$echo$$3412george.guo@ls:~$ps-aux|grep3412george.+34120.50.0213805120pts/46Ss11:000: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#includeintmain(){pid_tpid;pid_tppid;pid=getpid();ppid=getppid();system("./test");//systemwillforkaprocessforexec./testprintf("yespid=%d,yesppid=%d\n",pid,ppid);}

george.guo@ls:~$ cat test

#!/bin/bashecho"PIDofthisscript:$$"echo"test'sPPID(system'sforkid)=$PPID"echo"tests'spid=$$"

运行结果如下:

george.guo@ls~$ ./yes

PIDofthisscript:6082testsPPID(system'sforkid)=6081echotestsselfpidis6082yesPID=6080,yesPPID=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与进程实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。