守护进程
会话:进程组的更高一级,多个进程组对应一个会话
进程组:多个进程在同一个组,第一个进程默认是进程组的组长
创建会话的时候,组长不可以创建,必须由组员创建
创建会话的步骤:创建子进程,父进程终止,子进程成为会长
守护进程的步骤:
创建子进程fork
父进程退出
子进程当会长setsid,
切换工作目录$HOMR
设置掩码umask
关闭文件描述符0,1,2(为了避免浪费资源)
执行核心逻辑
退出
创建一个守护进程,每分钟在$HOME/log/下创建一个文件:程序名.时间戳
daemon.c
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#inlcude <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/type.h>
#include <sys/stat.h>
#define _FILE_NAMR_FORMAT_ "%s/log/mydaemon.%ld" //定义文件格式化
void touchfile(int num)
{
char *Homedir=getenv("HOME");
char strFilename[256]={0};
sprintf(strFilename,_FILE_NAMR_FORMAT_,Homedir,time(NULL));
int fd=open(strFilename,O_RDWR|O_CREAT,0666);
if(fd<0){
perrpr("open err");
exit(1);
}
close(fd);
}
int main()
{
//创建子进程,父进程退出
pid_t pid=fork();
if(pid>0){
exit(1);
}
//当会长
setsid();
//设置掩码
umask(0);
//切换目录
chdir(getenv("HOME")); //切换到家目录
//关闭文件描述符
//执行核心逻辑
struct itimerval myit={{60,0},{60,0}};
setitimer(ITIMER_REAL,&myit,NULL);
struct sigaction act;
act.sa_flags=0;
sigempty(&act.sa_mask);
act.sa_handler=touchfile;
sigaction(SIGALRM,&act,NULL);
while(1){
//每分钟在$HOME/log/下创建一个文件
sleep(1);
}
//退出
return 0;
}
精简版:
daemon.c
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#inlcude <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/type.h>
#include <sys/stat.h>
int main()
{
char strFilename[256]={0};
while(1){
memset(strFilename,0x00,sizeof(strFilename));
sprintf(strFilename,_FILE_NAMR_FORMAT_,Homedir,time(NULL));
int fd=open(strFilename,O_RDONLY|O_CREAT,0664);
if(fd<0){
perrpr("open err");
exit(1);
}
close(fd);
sleep(5);
}
return 0;
}
扩展了解:
通过nohup指令也可以达到守护进程创建的效果
nohup cmd [>1.log]&
nohup指令会让cmd收不到SIGCUP信号
&代表后台运行
2935

被折叠的 条评论
为什么被折叠?



