Linux 进程管理

浏览: 249 发布日期: 2016-11-29 分类: linux

在开始今天的分享以前,我想先说点什么,如果是一直在看我博客的朋友应该会发现,我在刚开始写博客的时候,分享了一些android上层的东西,也是因为我做了很多年的android上层,对它比较熟悉,所以写的内容也比较(自认为全面或深度还可以),但是我长期规划的目标是往底层走,所以我最近一段时间开始分享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进程管理就总结到这里,如有问题,欢迎指正,谢谢。

返回顶部