1>孤儿进程
父进程退出后,子进程还在继续运行,那么这些正在运行的子进程就是孤儿进程
最终孤儿进程将会被init进行收养,并由init进程对它们完成收集工作,init进程相当于爷爷进程,是最原始的进程
如果想模拟场景只需: kill父进程 即可
2>僵尸进程
一个进程用过fork来创建一个子进程,如果子进程退出了,父进程没有调用wait或者waitpid去获取子进程的状态信息,那么子进程会继续留在系统中,这就称为僵尸进程
僵尸进程不占用任何内存空间,仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,等待父进程进行回收,或者父进程结束那就init进程回收
如果父进程是一个循环不会结束,那么僵尸进行会一直保留在系统中
怎么查看僵尸进程:
利用命令 ps,可以看到有标记为的进程就是僵尸进程
3>守护进程
不与终端相关联,在系统启动是以特殊身份运行,处理系统级别的任务,避免进程被终端打断
如何成为守护进程
1.调用 fork(),创建新进程,它会是将来的守护进程.
2.在父进程中调用 exit,保证子进程不是进程组长
3.调用 setsid()创建新的会话区
4.将当前目录改成根目录(如果把当前目录作为守护进程的目录,当前目录不能被卸载他作为守护进程的工作目录)
5.将标准输入,标准输出,标准错误重定向到/dev/null.文章来源:https://www.toymoban.com/news/detail-434624.html
用以下代码即可(借鉴别人代码)文章来源地址https://www.toymoban.com/news/detail-434624.html
#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);
}
到了这里,关于孤儿,僵尸,守护线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!