五.进程PID
1.getpid()和getppid()
注意:pid_t的值都是正整数或0
下面我们来在代码当中查看一下process的进程ID和其父进程ID
while :; do ps ajx | head -1 && ps ajx | grep 可执行程序名字 | grep -v grep; sleep 1;done
这个shell命令可以死循环查看含有指定可执行程序名字的进程
每次while循环都会休眠1秒
按ctrl+c退出
根据进程ID查看对应进程的信息:
ps ajx | head -1 && ps ajx | grep 进程ID | grep -v grep
下面我们多次执行这个进程,发现:
2.fork()函数创建进程
1.fork()函数
2.演示
下面我们来演示一下
3.几点说明
1.进程的独立性
(任意)进程之间是具有独立性的,互相之间不能影响
即使父进程和子进程亲如父子,但是当我们的子进程和父进程都运行起来之后,
子进程挂了,代码也仍会存在,对父进程无影响
父进程挂了,代码也仍会存在,对子进程无影响
杀死父进程,子进程依然运行
不过此时因为父进程被杀死了,所以子进程无法通过ctrl+c退出
只能使用kill -9杀死子进程
杀死子进程,父进程依然运行,
右上方的窗口显示了子进程处于defunct(也就是关闭)的状态
说明子进程被杀死了,按ctrl+c后父进程可以正常退出
关于父子进程的话题,我们以后在介绍僵尸进程和孤儿进程的时候会进行详细说明的
在这里我们只需要知道:进程之间是具有独立性的,互相之间不能影响
2.关于fork函数返回值的几个问题
1.为何给父子进程的返回值是不同的?
通过fork函数的返回值区分父子进程,利用if else判断来让父子进程做不同的事情
2.fork函数为何会返回2次?
在fork函数内部,在执行到return语句之前,子进程已经被创建好了
又因为父子进程的代码是共享的
而且return语句本身也属于代码
所以return语句既会被父进程执行,也会被子进程执行
3.为何id作为同一个变量既可以表示父进程id,又可以表示子进程id呢?
这就涉及到写时拷贝的知识点了,先在这里提一下,以后我们还会提到的:
因此,我们可以得出:
在Linux中,可以用同一个变量名来表示不同的内存
4.创建多个子进程(观察进程的创建和退出的全过程)
下面我们创建多个子进程
观察一下进程的创建和退出的全过程
最后所有的子进程都退出了,只剩下一个父进程最后休眠了15秒之后才退出
这样我们就能够看到进程从创建到退出的全过程了
这里的子进程处于defunct(也就是关闭)的状态就表示该进程已经退出了
六.另一种查看进程的方法
1./proc
进程的信息可以通过 /proc 系统文件夹查看
ls /proc
查看具体某一个进程的信息:
ls /proc 进程id
下面我们用mycmd这个可执行程序来测试一下
我之前在Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉)这篇博客中提到过链接文件
接下来我们还会见到链接文件
2.exe链接文件
不过这个进程就只能执行这一次了,当这个进程结束之后,就无法再执行了
当我把mycmd这个可执行程序删除之后,这个进程依旧再运行
但是这个exe执行的那个可执行程序已经显示deleted了
3.如何改变cwd呢?
我们可以使用chdir函数
下面我们来实验一下
当前是在这个路径下
我想让它到
/home/wzs/wzsdir/systemlearndir
这个路径下
下面我们来创建一个文件
加深一下对cwd和fopen函数的理解
发现test.txt的确被创建在了
/home/wzs/wzsdir/systemlearndir
这个路径下
七.总结
这篇博客我们主要介绍了
1.冯诺依曼体系结构
2.操作系统
3.进程的概念,task_struct结构体
4.进程基础的相关操作:查看进程,杀死进程,改变进程所在工作目录
5.进程PID,fork函数创建进程
以上就是Linux进程理解(冯诺依曼体系结构,操作系统,进程概念和基本操作)的全部内容,希望能对大家有所帮助!