守护进程(Daemon)是一种在后台运行的特殊进程。它通常在操作系统启动时启动,并一直运行直至系统关闭。它不与任何终端关联,并且没有标准输入、输出和错误流。它的主要作用是在系统启动后执行一些特定的任务或者提供某些服务,例如网络服务、定时任务、日志记录等。它们通常使用 init 程序来启动和关闭。在 Linux 操作系统中,守护进程通常以字母“d”结尾,例如 httpd、sshd 、mysqld等。
守护进程(Linux的叫法,Windows上叫服务)
特点:后台、运行周期长。
会话(Session)是指用户登录系统后从登录到退出所经历的整个过程,期间可以运行多个进程,这些进程之间可以通过进程间通信(IPC)来进行数据交换。
会话首进程(Session Leader)是由用户登录时启动的第一个进程,它的进程号(PID)通常是1,它是该会话中所有进程的祖先进程。
进程组(Process Group)是一组相关进程的集合,它们可以通过进程组ID(PGID)来标识,其中一个进程被指定为组长进程。
组长进程(Group Leader)是进程组中的一员,它的任务是为该组的其他进程提供一个中心控制点,它通常是进程组中第一个启动的进程,也可以通过setpgid()系统调用来动态指定。组长进程可以接收来自终端的信号,它可以将信号传递给组中的其他进程,也可以将信号忽略或处理。
创建新会话
fork()让父进程退出,留下的就是子进程
挑一个组员进程,setsid()创建新进程,该进程变成组长进程
1.fork(),退出父进程//得到普通进程(非组长进程)
2.setsid()创建新会话
3.fork(),退出父进程(非必须)--防止进程组组长与其他进程关联
4.chdir("/");将当前的工作路径放到根目录--确保不会被卸载
5.umask(0);//删除掩码//给权限
6.close();//关闭标准输入输出
7.处理僵死进程;
umask掩码 (特殊权限)自己 同组人 other
掩码 umask 是一种权限掩码,用于限制文件和目录的默认权限。
它通常由三个八进制数字表示,分别代表文件所有者、同组用户和其他用户的权限。umask 的作用是在创建新文件或目录时,屏蔽掉一些默认权限,以达到更好的安全性和隐私保护。
例如,一个 umask 值为 022 的用户在创建新文件时,文件的默认权限为 rw-r--r--,即文件所有者有读写权限,同组用户和其他用户只有读权限。
守护进程不属于当前进程组
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<sys/stat.h>
int main()
{
pid_t pid = fork();
if(pid!=0)exit(0);//退出父进程
setsid();//创建新会话
pid_t pid1 = fork();
if(pid1!=0)
{
exit(0);
}
chdir("/");
umask(0);
int maxfd = getdtablesize();//得到文件描述符个数
for(int i=0;i<maxfd;i++)//关闭他们
{
close(i);
}
while(1)
{
FILE* fp = fopen("/tmp/testtest.log","a");//追加信息
if(fp==NULL)
{
break;
}
time_t tv;
time(&tv);
fprintf(fp,"time is %s",asctime(localtime(&tv)) );
fclose(fp);
sleep(5);
}
}
tail -f 文件名,可以看文件末尾追加的内容
删除守护进程