Linux中进程的学习总结

1进程的概念
程序:程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁…)
进程:活跃的程序,占用系统,在内存中执行。所以进程是系统最小的资源分配单位

2进程的状态
进程基本的状态有5种。分别为初始态,就绪态,运行态,挂起态与终止态
其中就绪态可以和初始态一起来看。

3进程控制块PCB
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。
其内部数据成员包括(进程id,进程的状态, 文件描述符表,和信号相关的信息,用户id和组id,会话(Session)和进程组等)

4进程的创建

pid_t pid;
pid = fork(); 

注意
1次调用两次返回
父子进程间遵循读时共享写时复制的原则
父子进程不共享全局变量

父子进程之间在fork后。有哪些相同,那些相异之处呢?
刚fork之后:
父子相同处: 全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式…
父子不同处: 1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集
5僵尸进程

僵尸进程:子进程结束,父进程没有明确的答复操作系统内核:已收到子进程结束的消息。此时操作系统内核会一直保存该子进程的部分PCB信息,同时将进程的状态置为defunct—>僵尸进程
通过ps -ef | grep "xxx"找到僵尸进程的PID,通过kill -9 PID,也不能强制杀死;即僵尸进程是不能够被直接消除掉的
僵尸进程的危害:占用PCB资源(主要是PID资源),系统将会因为产生大量的僵尸进程,而没有可用的进程号来产生新进程,导致系统资源不足
僵尸进程的三种解决方案:
核心思想:父进程的知道子进程的结束,并且明确的回复操作系统,此时操作系统才能回收PCB资源,避免僵尸进程的产生
此时父进程需要处理子进程的结束,需要调用wait()、waitpid()函数族;wait()会等待子进程的结束,调用wait()的进程会阻塞,直到接收到子进程的消息才被唤醒;子进程结束时,会给父进程发送SIGCHLD(17)信号
(1)、wait()用的场合:只能在父子进程中,父进程等待子进程的结束,一直在阻塞,信号通知父进程,避免了子进程的僵尸状态
wait()方法只能在具有子进程的进程中使用,如果一个进程没有子进程,调用wait()方法会失败
wait()方法是用于处理子进程结束状态的,同时让父进程明确告知操作系统内核已经处理了子进程的结束,从而使得操作系统能够彻底回收子进程的PCB信息
(2)、:将僵尸进程的父进程exit()结束掉,此时僵尸进程被init进程接收;init进程会查看进程状态,发现是僵尸进程,就会通知操作系统将其回收
(3)、:写一个信号处理函数,signal(SIGCHLD, 函数指针),在信号处理函数中调用wait()即可,此时父进程就会知道子进程结束,会明确的回复操作系统(就是当子进程结束时,信号处理函数接收到SIGCHLD信号时,方才调用wait(),此时父进程才阻塞)
注意:一次wait或waitpid()调用只能清理一个子进程,清理多个子进程应使用循环。
以上的解决方案:
方案一:使父进程长时间的阻塞
方案二:使父进程必须的结束掉
方案三:即可解决父进程的阻塞,又可避免僵尸进程的产生

6孤儿进程

孤儿进程:当父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程,由于进程不可能脱离进程树而独立存在,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程被收养后进行正常的释放,没有危害

7精灵进程
Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。
Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着
项目中让程序变成守护进程的方法一般是让server服务器变成守护进程

  #define INIT_DAEMON \
{ 
	if(fork() >0) exit(0); //让父进程退出,子进程变成孤儿进程
	setsid(); // 创建一个新的会话,也就是创建一个新的进程组
	//1构成孤儿进程 2创建一个新的会话 其实这两步可以变成守护进程但是这时的守护进程仍然能够具有跟前端连接的能力
	//执行第三步的原因是:守护进程创建的孩子,不在具有连接前台session的能力
	所以最后是孙子进程变成了守护进程
	if(fork()>0) exit(0); //让孩子进程退出,孙子变成守护进程
}

8守护进程的退出
守护进程的退出有两种方法:1编写shell脚本2编写程序
现在介绍编写shell脚本的方法

#!/bin/bash  
/#这里的#不是注释的意思这是在规定shell命令的解析器

MYUSER=`whoami`
echo $MYUSER
#awk 的作用是将一行进行切片 grep test | awk {'print $1'} 返回的test进程的pid
MYPID=`ps -u $MYUSER | grep test | awk {'print $1'}`
echo $MYPID


if [ -z $MYPID ]
then
        echo "SecMngServer have not start"
        exit 1
fi

kill -10 $MYPID

在创建shell脚本的时候出现下面的情况

[oracle@localhost test]$ ./test.sh
-bash: ./test.sh: /bin/bash^M: bad interpreter: 没有那个文件或目录

出现这种情况的原因是:
win环境下 : 回车换车 保存成文件 是2个字符
unix环境下: 回车换车 保存成文件 是1个字符
bash ====>只能解析unix文件格式
执行命令 vi test.sh
输入:set
出现下面的命令

commentstring=#%s   fileformat=dos       helplang=cn         ruler               ttyfast
noendofline           filetype=sh         history=50          textmode            

viminfo='20,"50
  backspace=indent,eol,start
  fileencoding=utf-8
  fileencodings=ucs-bom,utf-8,latin1
  guicursor=n-v-c:block,o:hor50,i-ci:hor15,r-cr:hor30,sm:block,a:blinkon0

fileformat=dos 说明文件是windos的系统文件
这时要更改文件格式
执行命令

 :set ff=unix

这样就可执行shell脚本的命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值