本文共 1571 字,大约阅读时间需要 5 分钟。
1. 守护进程
2. 孤儿进程
父进程结束,子进程就成为了孤儿进程。孤儿进程由1号进程(init进程)领养。
2.1实验:
实验思路: 先产生一个孤儿进程,然后打印出该孤儿进程的父进程ID。
#include#include #include #include #include #include #include // exit(0)int main(){ int i=0; printf("before fork : pid: %d, ppid: %d\n", \ getpid(), getppid()); pid_t pid = fork(); if(pid < 0){ perror("fork "); }else if(0 == pid){ sleep(3); }else{ exit(0); } printf("pid: %d, ppid: %d\n", \ getpid(), getppid()); while(1); printf("pid: %d \n", getpid()); return 0;}
2.1.1. ubuntu上编译运行
孤儿进程的父进程是init进程,即ID号为1的进程啊, 这里怎么是1673(upstart)进程? 百度下
经过百度,可以理解为: 在ubuntu内,upstart进程就是init进程。
2.1.2 嵌入式linux板子上运行:
小结: 孤儿进程的父进程是init进程, init进程的进程ID一般是1。 ubuntu上的init进程是sbin/upatsrt, 其进程ID不是1。
3. 僵尸进程及其避免方法
3.1 实验:
实验思路: 先产生一个僵尸进程, 然后在另一个终端内执行: ps -aux | grep process_name , 观察该进程是否为僵尸进程。
同时测试杀死僵尸进程的方法。
#include#include #include #include #include #include #include // exit(0)int main(){ int i=0; printf("before fork : pid: %d, ppid: %d\n", \ getpid(), getppid()); pid_t pid = fork(); if(pid < 0){ perror("fork "); }else if(0 == pid){ printf("pid: %d, ppid: %d\n", \ getpid(), getppid()); exit(0); } while(1); return 0;}
在一个ubuntu的终端内编译运行:
在另一个ubuntu终端内查看、验证该进程的僵尸状态
可见 12132进程是R,即运行态。 而12133是Z,即僵尸态。
接着,我们来测试杀死该僵尸进程的方法
测试1
小结: 使用kill -9 直接去杀僵尸进程 , 无法杀死。
测试2
此时已不存在ab内含有僵尸进程的信息。 所以僵尸进程已经被杀死。Ps: 这个12225 --color=auto不知道是啥信息,ubuntu上有这类信息了,不管他了,这不重要。
小结:杀死僵尸进程的父进程,可以达到杀死僵尸进程的目的。
.
转载地址:http://zzauz.baihongyu.com/