孤儿,僵尸,守护线程

1>孤儿进程

父进程退出后,子进程还在继续运行,那么这些正在运行的子进程就是孤儿进程
最终孤儿进程将会被init进行收养,并由init进程对它们完成收集工作,init进程相当于爷爷进程,是最原始的进程
如果想模拟场景只需: kill父进程 即可

2>僵尸进程

一个进程用过fork来创建一个子进程,如果子进程退出了,父进程没有调用wait或者waitpid去获取子进程的状态信息,那么子进程会继续留在系统中,这就称为僵尸进程
僵尸进程不占用任何内存空间,仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,等待父进程进行回收,或者父进程结束那就init进程回收
如果父进程是一个循环不会结束,那么僵尸进行会一直保留在系统中

怎么查看僵尸进程:
利用命令 ps,可以看到有标记为的进程就是僵尸进程

3>守护进程

不与终端相关联,在系统启动是以特殊身份运行,处理系统级别的任务,避免进程被终端打断

如何成为守护进程
1.调用 fork(),创建新进程,它会是将来的守护进程.
2.在父进程中调用 exit,保证子进程不是进程组长
3.调用 setsid()创建新的会话区
4.将当前目录改成根目录(如果把当前目录作为守护进程的目录,当前目录不能被卸载他作为守护进程的工作目录)
5.将标准输入,标准输出,标准错误重定向到/dev/null.

用以下代码即可(借鉴别人代码)

#include <fcntl.h>
#include <unistd.h>
int daemon(int nochdir, int noclose)
{
		int fd;
		switch (fork()) {
		case -1:
		return (-1);
		case 0:
		break;
		default:
		_exit(0);
}
if (setsid() == -1)
	return (-1);
if (!nochdir)
	(void)chdir("/");
if (!noclose && (fd = open("/dev/null", O_RDWR, 0)) != -1) {
	(void)dup2(fd, STDIN_FILENO);
	(void)dup2(fd, STDOUT_FILENO);
	(void)dup2(fd, STDERR_FILENO);

	if (fd > 2)
	(void)close (fd);
	}
	return (0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值