浅谈三种特殊进程:孤儿进程,僵尸进程和守护进程

昨天学了进程控制,就这三种特殊的进程研究了一下,其中也借鉴了一些前人总计的经验。

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://www.mzph.cn/news/448475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计师为什么要学编程,开发者为什么要学设计?

摘要&#xff1a;设计师和开发者目前正处于互联网的两端&#xff0c;看着彼此做不同的工作。如果他们能互相学习对方的技术&#xff0c;那么会协作得更好。 很多开发者认为&#xff0c;设计师应该学会如何编写代码&#xff0c;这一点是真的&#xff1a;通过学习&#xff0c;设计…

git 查看远程仓库地址

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 就一个命令&#xff1a; git remote -v 如下&#xff1a;

tensorflow之tf.train.exponential_decay()指数衰减法

exponential_decay(learning_rate, global_steps, decay_steps, decay_rate, staircaseFalse, nameNone) 使用方式&#xff1a; tf.tf.train.exponential_decay() 例子&#xff1a; tf.train.exponential_decay(self.config.e_lr, self.e_global_steps&#xff0c;self.config…

wait( )和 waitpid( )

进程一旦调用了wait&#xff0c;就立即阻塞自己&#xff0c;由wait自动分析是否当前进程的某个子进程已经退出&#xff0c;如果让它找到了这样一个已经变成僵尸的子进程&#xff0c;wait就会收集这个子进程的信息&#xff0c;并把它彻底销毁后返回&#xff1b;如果没有找到这样…

在 vscode 中使用 Git :拉取、提交、克隆

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 PS&#xff1a;转载此文后&#xff0c;网友在评论中提到还有其它方法&#xff0c;不过目前个人尚在研究中&#xff0c;有兴趣的朋友们也可…

vscode 配置 git (配置、暂存、推送、拉取、免密)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 vscode 中对 git 进行了集成&#xff0c;很多操作只需点击就能操作&#xff0c;无需写一些 git 指令。 不过这就需要你对 vscode 进行配…

处理bugs心法

1. 前提 第一层&#xff1a;遇到异常首先必须告诉自己&#xff0c;冷静&#xff0c;不要慌。&#xff08;一看到Bug就心慌&#xff0c;那么武功就施展不了了&#xff09; 2. 入门级 第二层&#xff1a;遇到Bug&#xff0c;第一潜意识看输出异常的信息的&#xff08;控制台输出&…

解决 VS Code 保存时候自动格式化

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 不知道从哪个版本起&#xff0c;VS code 保存会自动格式化。 以前都是altshiftF格式化的&#xff0c;现在一保存就格式化&#xff0c;而…

12种食物最养男人 10种食物最养女人 太值得收藏了

据统计&#xff0c;男性10大死因中有4项与饮食有关&#xff0c;包括癌症、脑血管疾病、心脏病和糖尿病。以下12种食品对男性健康有益&#xff0c;建议男性多多摄取。 男人需要的十种养生食物 No.1西红柿 西红柿的酸味能促进胃液分泌&#xff0c;帮助消化蛋白质等&#xff…

ES 基础

1. ES 基础一网打尽 1.1 ES定义 ESelaticsearch简写&#xff0c; Elasticsearch是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB级别的数据。 Elasticsear…

为什么 那么多 前端开发者都想学 Vue.js

根据JavaScript 2017 前端库状况调查 Vue.js是开发者最想学的前端库。我在这里说明一下我为什么认为这也是和你一起通过使用 Vue 构建一个简单的 App 应用程序的原因。 我最近曾与 Evan You&#xff0c;Chris Fritz&#xff0c;Sarah Drasner&#xff0c;和 Adam Jahr 做了一个…

进程间通信之管道通信

两个程序之间传递数据的一种简单方法是使用popen和pclose。 #include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FILE *stream); popen函数允许一个程序将另一个程序作为新进程来启动&#xff0c;并可以传递数据给它或者通过它接收数据…

vue 各组件 使用 Demo

环境搭建 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 假设你已经通读vue官方文档&#xff08;文档都没读一遍&#xff08;至少&#xff09;&#xff0c;那不建议动手撸码&#xff…

Dropbox推独立应用,公司估值已达100亿美元

摘要&#xff1a;Dropbox刚获得5亿美元的新一轮融资&#xff0c;其估值已高达100亿美元&#xff0c;现在又推出针对云服务的独立应用Carousel&#xff0c;不久之后&#xff0c;还会有应用陆续推出&#xff0c;随着美国前国务卿赖斯的加盟&#xff0c;Dropbox在云市场的表现异常…

SQL经典面试题(二)

有3个表S&#xff0c;C&#xff0c;SCS&#xff08;SNO&#xff0c;SNAME&#xff09;代表&#xff08;学号&#xff0c;姓名&#xff09; //主键&#xff1a;SNO //多个人&#xff0c;多门课 3张表 &#xff0c;SC 关系表C&#xff08;CNO&#xff0c;CNAME&#xff0c;…

开源当自强:我们不是“便宜货”

之前人们争相使用开源软件&#xff0c;无非是因为它便宜、好用、易得&#xff0c;不过根据最新的开源软件调查显示&#xff0c;人们使用开源软件最主要的原因还是看重它的高质量。 成本低是很过公司参与开源项目的最主要原因之一&#xff0c;而现在他们视开源是一条通往创新、省…

python内建函数和工厂函数的整理

内建函数参阅&#xff1a; https://www.cnblogs.com/pyyu/p/6702896.html 工厂函数&#xff1a; 本篇博文比较粗糙&#xff0c;后续会深入整理转载于:https://www.cnblogs.com/qiang-upc/p/11155786.html

显卡天梯图:2014最新显卡性能天梯图

随着电脑游戏的推广&#xff0c;很多用户都喜欢上了电脑网络游戏&#xff0c;所以组装电脑用户在装机的时候&#xff0c;会考虑电脑配置的游戏性能&#xff0c;要提高电脑配置游戏性能首要条件就是显卡性能要强&#xff0c;如果显卡性能不佳&#xff0c;那么其它方面性能再强&a…

【显卡天梯图】2014年最新显卡天梯图 – 【迄今最全系列显卡】

【显卡天梯图】2014年最新显卡天梯图 – 【迄今最全系列显卡】 随着电脑游戏的推广&#xff0c;很多用户都喜欢上了电脑网络游戏&#xff0c;所以组装电脑用户在装机的时候&#xff0c;会考虑电脑配置的游戏性能&#xff0c;要提高电脑配置游戏性能首要条件就是显卡性能要强&am…

原理系列:Spark1.x 生态圈一览

Spark生态圈&#xff0c;也就是BDAS&#xff08;伯克利数据分析栈&#xff09;&#xff0c;是伯克利APMLab实验室精心打造的&#xff0c;力图在算法&#xff08;Algorithms&#xff09;、机器&#xff08;Machines&#xff09;、人&#xff08;People&#xff09;之间通过大规模…