1》#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>
#define _FILE_NAME_FORMAT_ "%s/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()
{
// 创建子进程,父进程退出
pid_t pid = fork();
if(pid > 0){
exit(1);
}
// 当会长
setsid();
// 设置掩码
umask(0);
// 切换目录
chdir(getenv("HOME"));//切换到家目录
// 关闭文件描述符
//close(1),close(0),close(2);
// 执行核心逻辑
//struct itimerval myit ={{60,0},{60,0}};
struct itimerval myit ={{60,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){
//每隔1分钟在/home/itheima/log 下创建文件
sleep(1);
//do sth
}
// 退出
return 0;
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>
#define _FILE_NAME_FORMAT_ "%s/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()
{
// 创建子进程,父进程退出
pid_t pid = fork();
if(pid > 0){
exit(1);
}
// 当会长
setsid();
// 设置掩码
umask(0);
// 切换目录
chdir(getenv("HOME"));//切换到家目录
// 关闭文件描述符
//close(1),close(0),close(2);
// 执行核心逻辑
//struct itimerval myit ={{60,0},{60,0}};
struct itimerval myit ={{60,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){
//每隔1分钟在/home/itheima/log 下创建文件
sleep(1);
//do sth
}
// 退出
return 0;
}
2》
#define CREATE_DAEMON if(fork()>0)exit(1);setsid();
3》
#define INIT_DAEMON \
{ \
if(fork() >0) exit(0); \
setsid(); \
if(fork()>0) exit(0); \
}
会话:进程组的更高一级,多个进程组对应一个会话。
进程组:多个进程在同一个组,第一个进程默认是进程组的组长
创建会话的时候,组长不可以创建,必须是组员创建。
创建会话的步骤:创建子进程,父进程去死,子进程自当会长。
守护进程:脱离终端控制,在后台运行,周期执行一系列任务的进程
守护进程的步骤:
创建子进程 fork
○ 父进程退出
○ 子进程当会长 setsid
○ 切换工作目录 $HOME
○ 设置掩码 umask
○ 关闭文件描述符 0, 1, 2 ,为了避免浪费资源
○ 执行核心逻辑
○ 退出