进程状态
Linux下进程状态:
R运行状态:表示进程正在运行中或者在运行队列里
S睡眠状态:也叫作可中断睡眠状态,意味着进程在等待某事件的完成而被挂起
D磁盘休眠状态:也叫做不可中断睡眠状态,在这个状态下的进程通常会等待IO的结束
T停止状态:可以通过发送SIGSTOP信号给进程来停止进程
X死亡状态:这个状态只是一个返回状态
Z僵死状态:当一个进程退出,并且其父进程没有读取到子进程退出的返回值时会产生僵尸进程
进程的状态查看:ps -aux / ps -ef
僵尸进程
僵尸进程就是处于僵死状态的进程
僵尸进程产生原因:子进程先于父进程退出,因为要保存退出原因,操作系统不能释放所有资源,通知父进程退出原因,父进程没有关注到这个通知,导致子进程退出后无法释放资源,处于僵死状态,称为僵尸进程
僵尸进程的危害:因为僵尸进程的资源得不到释放,所以会造成内存泄漏
如何避免产生僵尸进程:进程等待
产生了僵尸进程如何处理:退出父进程,僵尸进程也就跟着退出了
僵尸进程的实现:
1 #include<stdio.h>
2 #include<unistd.h>
3
4 int main(){
5 printf("hello world! pid:%d\n",getpid());
6 pid_t pid=fork();
7 if(pid<0){
8 printf("fork error\n");
9 return -1;
10 }
11 else if(pid==0){
12 printf("i am child! pid:%d\n",getpid());
13 }
14 else{
15 printf("i am parent! pid:%d\n",getpid());
16 }
17 printf("nihao! pid:%d\n",getpid());
18 while(1){
19 printf("2333!!!\n");
20 sleep(10);
21 }
22 return 0;
23 }
此时子进程pid为13767,父进程pid为13766
用kill命令杀死子进程后,子进程并没有直接终止,而是变成了僵死状态,成为了僵尸进程
孤儿进程
孤儿进程:父进程先于子进程退出,子进程就会成为孤儿进程
特性:运行在后台,父进程变成了1号进程
特殊的孤儿进程:精灵进程/守护进程
使用上面的代码
此时父进程pid为14605,子进程pid为14606,让父进程退出,此时可以看到子进程状态 变为S,运行在后台,其父进程为1.