- 守护进程的特点
(1)守护进程是Linux中三大进程之一,始终运行在后台,通常系统开始时运行,系统关闭时结束。
(2)独立于控制终端(与终端无关)。
(3)周期性执行某种任务或等待某些事件的发生。
2.创建守护进程(例:每隔五秒将系统时间写入到文件)
(1)创建子进程,父进程退出。(子进程成为后台进程)
if(fork()>0)
{
exit(0);
}
(2)设置新的会话。
会话:
Linux是以会话,进程组的方式管理进程,每个进程属于一个进程组,会话是一个或多 个进程组的集合,通常用户打开一个终端,系统会创建一个会话,所有通过该终端运行的程序都属于这个会话。
Shell进程-----会话组的组长。一个会话最多打开一个终端,当控制终端关闭,所有相关进程也会结束。
#include <sys/types.h>
#include <unistd.h>
pid_t setsid(void);
(3)设置工作目录。
#include <unistd.h>
int chdir(const char *path);
(4)重设文件掩码。
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
(5)关闭从父进程继承下来的文件描述符。
#include <unistd.h>
int getdtablesize(void);//获得当前进程文件描述符表大小
(6)周期性执行任务。
3.代码如下:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/stat.h>
int main(int argc, const char *argv[])
{
//1.创建子进程,父进程退出
int pid;
pid=fork();
if(pid<0)
{
perror("fork error");
return -1;
}
else if(pid>0)
{
exit(0);
}
//2.设置新会话
int ret;
ret=setsid();
if(-1==ret)
{
perror("setsid error");
return -1;
}
//3.设置工作目录
chdir("/tmp");
//4.重设文件掩码
umask(0);
//5.关闭从父进程继承下来的文件描述符
int i;
for(i=0;i<getdtablesize();i++)
{
close(i);
}
//在time.txt中每隔5秒打印系统时间
while(1)
{
system("echo `date`>>time.txt");
sleep(5);
}
return 0;
}