linux的守护进程本质是为服务器的后台做日志的 什么是日志呢 就是保留信息的 用数据库 比如学生的姓名 年龄等等 还有时间 许多数据库的table 并且不断的及时更新 由客户端的输入信息
linux的守护进程注意一点要彻底脱离当前父进程所在的控制终端和会话组 为了保持独立性
守护进程其实本质就是个孤儿进程 因为他在后台运行 我们在使用这个后台进程的时候 需要注意一个问题 因为父进程是进程组组长 所以不能进行创建新的会话组 sid ,所以只能是通过子进程进行创建守护进程
举个例子:
#include
#include
#include
#include
#include
#include
#include
/*#include
int daemon(int nochdir, int noclose);
参数:
nochdir:=0将当前目录更改至“/”
noclose:=0将标准输入、标准输出、标准错误重定向至“/dev/null”
返回值:
成功:0
失败:-1
*/
#define ERR_EXIT(m)
do
{
perror(m);
exit(EXIT_FAILURE);
}
while (0);
void creat_daemon(void);
int main(void)
{
time_t t;
int fd;
creat_daemon();//创建守护线程
fd = open(“daemon.log”,O_WRONLY|O_CREAT|O_APPEND,0644);//创建并且打开守护线程日志文件
while(1){
if(fd == -1)
ERR_EXIT("open error");
char *buf = asctime(localtime(&t));//localtime return struct tm* ::::::asctime return char*
write(fd,buf,strlen(buf));
sleep(1);
break;
}
close(fd);
return 0;
}
void creat_daemon(void)
{
pid_t pid;
pid = fork();
if( pid == -1)
ERR_EXIT(“fork error”);
if(pid > 0 )//退出父进程
exit(EXIT_SUCCESS);
if(setsid() == -1)//如果子进程已经是进程组的组长那么就不能创建脱离父进程的所属组 返回-1
ERR_EXIT(“SETSID ERROR”);
for(int i=0;i<3;++i)
{
close(i);
//open第一次重定向到i 并且返回i
open("/dev/null",O_RDWR);//关闭标准输入 标准输出 标准出错流 重定向到/dev/null这个垃圾桶 因为守护进程不需要显示信息到前台 也不需要标准输入信息 所以如果后台自动产生标准输入 直接把输入信息放到垃圾桶 防止内存被垃圾信息占用
}
chdir("/");//更改新进程的工作目录
umask(0);//设置文件掩码
return;
}
这里有个重定向到/dev/null的demon
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//重定向标准输入 输出 错误输出 到/dev/null垃圾桶 防止输出的东西占用资源 因为后台线程不需要
int main(void)
{
int i=0;
for(i;i<3;++i)
{
close(i);
open("/dev/null",O_RDWR);
}
char buf[1024];
bzero(buf,sizeof(buf));
read(0,buf,sizeof(buf));
char buff[120]=“123”;
write(1,buff,sizeof(buff));
return 0;
}