Linux 进程管理 详述
我长期规划的目标是往底层走,所以我最近一段时间开始分享Linux的一些文章,前期是Linux基本操作,然后是Linux应用开发,最后我还打算研究Linux底层内核,驱动,因为Linux这块我也是初学者,所以在分享文章的时候,可能有些人会觉得比较浅,我在刚刚开始写文章的时候就说了,目的一方面是分享给大家,另外一方面算是自己的一个笔记,整理出来,加深理解,所以最近的文章或者接下来的文章,可能有些内容比较基础或不够全面,也请见谅。。。
好了,花了一个周末研究了下Linux 进程管理,今天就来简单谈谈:
我们先用ps -ef查看下进程
PID就是进程ID,PPID是父进程ID
/sbin/init是1号进程,我们可以看到ps -ef 的进程ID是2090,父进程ID是1960
1960号进程是-bash,也就是我们的shell,它的父进程是1956
1956号进程是 sshd:root@pts/0,也就是我们的远程终端,它的父进程是1516,/usr/sbin/sshd是一个sshd的服务,1516号进程的父进程是1 init
我们可以在程序中来查看当前进程的pid和ppid
我们用scanf等待输入,防止进程死掉
那么我们的进程在内核中是如何运行的呢
其实内核的运行也是需要操作内存,但是每个进程又是独立的,这就需要虚拟内存来实现,每个进程有自己的虚拟内存,里面存储了代码区,堆,共享库,栈,环境变量,命令行参数,内核地址空间等等,然后通过时间片的方式真正操作内存
就好像一个正在读取的磁盘一样,一直在转,轮询到自己的时候,就真正操作内存来执行,其他时间就等待。
所以Linux进程执行是多任务,分时执行的,看上去好像是同时执行,其实是轮着执行
我们可以通过fork函数创建一个进程
执行结果:
我们可以看到父进行和子进程都执行了
fork的过程就是父进程把自己的虚拟内存中存的东西,拷贝一份直接给子进程,然后接下来的执行过程分为两个分支,父进程和子进程同时执行,执行的先后顺序不确定。
我们对上面的代码稍微修改下:
执行结果:
我们可以看到count的结果都是1,代表父进程和子进程是分开执行的,并且互不影响
我们来看下面一个程序:
执行结果:
总共有8个进程了,这个分裂的过程是怎么回事呢
第一次fork
第二次fork
第三次fork
下面我们来谈一下vfork
vfork是与父进程共享地址空间,并且父进程会等子进程执行完毕,才执行,子进行有自己的pid
看例子:
执行结果:
由于子进程是和父进程共享内存地址空间,所以子进程执行完,父执行再执行的时候,count=2了
进程的等待就是wait函数,进程的销毁就是exit函数,这个没什么好说的
下面看下执行文件exec族
就是用来执行文件的,下面我们举两个例子
后面的参数要从命理开始,最后以NULL结尾
运行结果:
运行结果跟上面一样的,其他函数,读者自己写下,运行下就行了
下面来看看守护进程Daemon
守护进程是脱离终端,在后台运行的进程,不会因为终端关闭而关闭
创建守护进行一般是如下几个步骤
1 创建子进行,退出父进程
2 创建新的会话,来脱离终端
3 关闭所有的文件描述符
4 改变工作目录为根目录
5 umask重设权限掩码
6 具体事件
我们来看一个例子
运行
ps -ef
我们看到./mydaemon的进程的父进程是1了
再来看看是否一直在往文件中写内容
如果想杀死这个进程,用kill 进程号即可
再看
我们的守护进程被杀死了
好了,Linux进程管理就总结到这里,如有问题,欢迎指正,谢谢。