会话:进程组的更高一级,多个进程组对应一个会话。
进程组:多个进程在同一个组,第一个进程默认是进程组的组长。
创建会话的时候,组长不可以创建,必须是组员创建。
创建会话的步骤:创建子进程,父进程退出,子进程自当会长。
守护进程的步骤(红色必须步骤):
1.创建子进程fork
2.父进程退出
3.子进程当会长setid
4.切换工作目录$HOME
5.设置掩码 umask
6.关闭文件描述符0,1,2,为了避免浪费资源
7.执行核心逻辑
8.退出
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <signal.h>
#define _FILE_NAME_FORMAT_ "%s/work/linux_c/daemon/log/mydaemon.%ld"
void touchfile(int num)
{
char *HomeDir = getenv("HOME");
char strFilename[256] = { 0 };
sprintf(strFilename, _FILE_NAME_FORMAT_, HomeDir, time(NULL));
int fd = open(strFilename, O_RDWR | O_CREAT, 0666);
if (fd < 0)
{
perror("open err");
exit(1);
}
close(fd);
}
int main(int argc, char const *argv[])
{
//创建子进程,父进程推出
pid_t pid = fork();
if (pid > 0)
{
exit(1);
}
//当会长
if (setsid() == -1)
{
perror("setsid error");
return;
}
//设置掩码
umask(0);
//切换目录
chdir(getenv("HOME"));
//关闭文件描述符
//close(1), close(1), close(2);
//执行核心逻辑 //每隔10秒在/home/wyl/log下创建文件
struct itimerval myit = { {10, 0}, {1, 0} };
setitimer(ITIMER_REAL, &myit, NULL);
struct sigaction act;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
act.sa_handler = touchfile;
sigaction(SIGALRM, &act, NULL);
while (1)
{
sleep(1);
}
//退出
return 0;
}