浅谈三种特殊进程:孤儿进程,僵尸进程和守护进程
昨天学了进程控制,就这三种特殊的进程研究了一下,其中也借鉴了一些前人总计的经验。
1、孤儿进程
如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这里子进程的父进程就是init进程(1号进程).其实还是很好理解的。
// 父进程先子进程退出
// 子进程会被祖父进程接手并在后台运行,执行内部的代码
int main()
{pid_t pid = fork();switch (pid){case -1:perror ("fork");break;case 0: // 子进程close (1);// 创建一个文件用来保存输出的文字int fd = open ("child", O_RDWR|O_CREAT, 0777);printf ("我是子进程,我的ID是%d\n", getpid());while (1){printf ("找爸爸\n");fflush (stdout);sleep (2);}break;default: // 父进程printf ("我是父进程:ID = %d\n", getpid());printf ("我走啦\n");while (1);break;}return 0;
}
在这里我们运行了程序,可以在另一终端看到有2个a.out在运行,我们将父进程终止,子进程并没有退出,而是在后台继续运行,并向child文件中输出文字。
2、僵尸进程
如果我们了解过Linux进程状态及转换关系,我们应该知道进程这么多状态中有一种状态是僵死状态,就是进程终止后进入僵死状态(zombie),等待告知父进程自己终止,后才能完全消失.但是如果一个进程已经终止了,但是其父进程还没有获取其状态,那么这个进程就称之为僵尸进程.僵尸进程还会消耗一定的系统资源,并且还保留一些概要信息供父进程查询子进程的状态可以提供父进程想要的信息.一旦父进程得到想要的信息,僵尸进程就会结束.
// 子进程比父进程先退出
int main()
{int count = 5;while (count--){//signal(SIGCHLD,SIG_IGN);pid_t pid = fork();switch (pid){case -1:perror ("fork");break;case 0: // 子进程printf ("我是子进程,我的ID是%d\n", getpid());printf ("我走啦\n");exit (0);default: // 父进程printf ("我是父进程,我的ID是%d\n", getpid());//while(1);break;}}while(1);return 0;
}
signal(SIGCHLD,SIG_IGN);加上这行代码后僵尸进程都消失了。
通过ps -ef | grep a.out 我们可以得知进程信息和进程pid,可以看到子进程就是处于defunct状态.这时我们肯定想要怎么才能避免僵尸进程呢?看程序被我注释的那句signal(SIGCHLD,SIG_IGN),加上就不会出现僵尸进程了.那我们就加点篇幅讲一下为什么就可以避免僵尸进程呢?
这是signal()函数的声明sighandler_t signal(int signum, sighandler_t handler),我们可以得出,signal函数的第一个函数是linux支持的信号,第二个参数是对信号的操作 ,是系统默认还是忽略或捕获.我们这是就可以知道signal(SIGCHLD,SIG_IGN)是选择对子程序终止信号选择忽略,这是僵尸进程就是交个内核自己处理,并不会产生僵尸进程.
3、守护进程
同样我们需要了解一下什么是守护进程,守护进程就是在后台运行,不与任何终端关联的进程,通常情况下守护进程在系统启动时就在运行,它们以root用户或者其他特殊用户(apache和postfix)运行,并能处理一些系统级的任务.习惯上守护进程的名字通常以d结尾(sshd),但这些不是必须的.
下面介绍一下创建守护进程的步骤:
· 调用fork(),创建新进程,它会是将来的守护进程.
· 在父进程中调用exit,保证子进程不是进程组长
· 调用setsid()创建新的会话区
· 将当前目录改成跟目录(如果把当前目录作为守护进程的目录,当前 目录不能被卸载他作为守护进程的工作目录)
· 将标准输入,标注输出,标准错误重定向到/dev/null
// 守护进程
int daemonize (int nochdir, int noclose)
{// 创建子进程,关闭父进程pid_t pid = fork();if (pid > 0) // 父进程{exit (0);}else if (pid < 0){return -1;}// 2、设置文件的掩码,mode & ~umaskumask (0);// 3、设置新的会话:脱离当前会话和终端的控制if (setsid() < 0){return -1;}// 当nochdir为0时,daemon将更改进程的根目录为rootif (0 == nochdir){// 改变当前的工作目录if (chdir ("/") < 0){return -1;}}// 标准输入、关闭标准输出、标准错误close (STDIN_FILENO);close (STDOUT_FILENO);close (STDERR_FILENO);if (0 == noclose){// 重定向标准输入、关闭标准输出、标准错误open ("dev/null", O_RDONLY); // 0open ("dev/null", O_RDWR); // 1open ("dev/null", O_RDWR); // 2}return 0;
}int main()
{daemonize (0, 0);// daemon (0,0); // 系统自带守护进程while (1);return 0;
}
浅谈三种特殊进程:孤儿进程,僵尸进程和守护进程相关推荐
- (转)认识动作捕捉系统 浅谈三种主流解决方案
转自http://news.17173.com/content/2016-03-14/20160314102718031.shtml 目前动作捕捉系统有惯性式和光学式两大主流技术路线,而光学式又分为标 ...
- 浅谈三种近场通信技术特点以及未来应用场景分析与预测
一.三种近场通信技术特点 1.WIFI WiFi全称Wireless Fidelity,具有传输速度较高(可以达到UMbps).有效距离长和接入设备多等优点.IEEE 802.11是针对WIFI技术制 ...
- 浅谈三种近场通信技术的特点,对未来近场通信技术的应用场景进行分析与预测
一.三种近场通信技术特点 1.WIFI 概念:创建于IEEE 802.11标准的无线局域网技术.WiFi(Wireless Fidelity,无线保真技术)即IEEE 802.11协议,是一种短程无线 ...
- 浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/14/network_attack_of_blockchain_ddos_attack/ 写在前面的话 自比特币 ...
- 浅谈三角带的使用及其分类
浅谈三角带的使用及其分类 特殊加工传送带http://www.gardner-js.com/csd.html三角带又称V型带,是传动带中产量最大.品种最多.用途最广的一种产品.自从1917年首次由美国 ...
- [原]浅谈几种服务器端模型——反应堆模式(epoll 简介) - _Boz - 博客园
[原]浅谈几种服务器端模型--反应堆模式(epoll 简介) - _Boz - 博客园 [原]浅谈几种服务器端模型--反应堆模式(epoll 简介) 引言:上一篇说到了线程池方式来处理服务器端的并发, ...
- (一)永磁同步电机矢量控制(三电平)——浅谈三电平逆变器
由于前几天比较忙,这期更新有点迟了!!不过没关系,在新的章节会保持每周更新1~2篇博文. 0 前言 这期我们开始新的章节--永磁同步电机矢量控制(三电平). 记得前两三周我在做三电平的PMSM矢量 ...
- 浅谈几种区块链网络攻击以及防御方案之其它网络攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特 ...
- 浅谈几种区块链网络攻击以及防御方案之女巫攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/13/network_attack_of_blockchain_sybil_attack/ 写在前面的话 自比特 ...
最新文章
- Python中的赋值、引用和深浅拷贝
- 完全掌握JavaMail
- 笔记-项目整体管理-项目工作说明书
- 小希的迷宫 HDU - 1272 (并查集)
- 今天开通一个真正属于自己的博客了《L.M》
- SageMath安装及使用
- OpenGL ES SDK for Android - 4
- 安卓双屏折叠手机!看了微软时隔四年发布的手机 手里的iPhone差点掉地上
- 玉米社:短视频运营主要做哪些工作?
- 蓝桥杯之单片机学习(十)——PWM脉宽调制信号的发生与控制
- C语言绘图示例-繁花图案
- python12306买票_Python 使用 selenium 实现半自动购买12306火车票
- 深度学习环境搭建:linux下 Ubuntu16.04+cuda8.0+cudnn+anaconda+tensorflow并配置远程访问jupyter notebook
- 聚苯乙烯荧光单分散微球|Monodispersepolystyrenemicrospheres
- 【友盟+】国庆假期旅游类APP使用报告(上)
- 用计算机求解问题的一般步骤,计算机问题求解过程包括哪些步骤
- “国民记忆”品牌的年轻化战略,从换掉王力宏开始?
- 软件业自由之神---Richard Stallman
- python爬取豆瓣排行榜电影(静态爬取)(二次爬取)
- 特征缩放+无量纲化:最小最大缩放 - Python代码实现
热门文章
- Android手机mm开头的大文件,[2018年最新整理]2Android源代码编译命令m和mm和mmm以及make分析.doc...
- android nougat和安卓7.1,Android Nougat 7.1.2 先睹为快
- leetcode270. 最接近的二叉搜索树值
- 算法总结-1算法入门
- C++(STL):01---pair容器
- 《Java8实战》笔记(05):使用流
- python为什么运行不了_python为什么会环境变量设置不成功
- 密码学专题 文件编码格式
- C++中size_t的学习
- codeforces 282A-C语言解题报告