创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥Linux系列专栏:Linux基础 🔥给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
目录
- 一、孤儿进程
- 二、守护进程
- 如何建立新会话?
- 守护进程的创建
一、孤儿进程
孤儿进程是父进程结束后,自己仍继续运行的进程。孤儿进程会被1号进程(init进程)收养。
每当出现一个孤儿进程的时候,内核就把孤儿的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。
二、守护进程
守护进程是一种在后台持续运行的特殊进程。守护进程一般不与用户直接交互,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程是一种特殊的孤儿进程。
守护进程丢弃了原有的控制终端,因此需要创建新会话以脱离控制终端。
会话是多个进程组的集合。
如何建立新会话?
建立新会话时,先调用fork()
,父进程终止,子进程调用setsid()
函数
创建会话函数:
以自己的ID设置进程组ID,同时也是新会话的ID
pid_t setsid(void)
返回值:
- 成功返回进程的会话id
- 失败返回-1
获取当前进程的会话id:
pid_t getsid(pid_t pid);
返回值:
- 成功返回进程的会话id
- 失败返回-1
守护进程的创建
- 1.父进程调用
fork()
函数创建子进程,终止父进程,让其子进程成为孤儿进程 - 2.子进程调用
setsid()
函数创建一个新会话,脱离终端 - 3.改变工作目录位置为根目录,防止目录被卸载
- 4.重新设置文件的权限掩码,umask = 0002
- 5.关闭或重定向文件描述符(STDIN_FILENO和STDOUT_FILENO),让错误信息等不打印在前台
- 6.循环执行业务
创建守护进程代码示例:
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
void daemon_create()
{
pid_t pid;
pid = fork();
if(pid > 0)
{
exit(0); //父进程退出
}
else if(pid == 0)
{
int errfd;
setsid(); //创建新会话
errfd = open("error.log",O_RDWR|O_CREAT,0664);
close(STDIN_FILENO); //关闭输入输出描述符
close(STDOUT_FILENO);
dup2(errfd,STDERR_FILENO);//描述符重定向
umask(0002); //修改权限掩码
chdir("./"); //工作路径改为根目录
while(1)
{
//do something...
}
}
else
{
perror("fork call failed\n");
}
}
int main()
{
daemon_create();
return 0;
}
守护进程的特点:
- 守护进程脱离于终端并且在后台运行,不会在终端上打印运行信息,终端关闭也会运行
- 生命周期长,占用资源少,能够持续运行完成任务,广泛应用于各种服务器
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |