linux进程开发之(六):守护进程
时间:2010-10-25 来源:andyluo324324
守护进程,即linux中的后台服务进程,下面具体分析dameon.c函数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h> #define MAXFILE 65536 int main()
{
pid_t pc;
int i,fd,len;
char *buf="this is a Dameon\n";
len=strlen(buf);//得到buf的长度
pc=fork();//第一步:创建一个子进程
if(pc<0)
{
printf("error fork\n");
exit(1);
}
else if(pc>0)//父进程退出
{
exit(0);
}
setsid();//第二步:调用setsid函数,在子进程中创建新会话
chdir("/");//第三步:改变当前目录为根目录
umask(0);//第四步:重设文件权限掩码
for(i=0;i<MAXFILE;i++)//第五步:关闭文件描述符
{
close(i);
}
while(1)//这时创建完守护进程,以下开始正式进入守护进程工作
{
if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0666))<0)//打开文件
{
perror("open");
exit(1);
}
write(fd,buf,len+1);//想文件中写数据
close(fd);
sleep(10);
}
} /*--------------------------------------------------
1.守护进程概述
守护进程,也就是所说的Daemon进程,是linxu中的后台服务进程。它是一个生存期较长的进
程,通常独立于控制终端并且周期性的地执行某种任务或等待处理某些发生的事件。守护进
程常常是系统引导装入时启动,在系统关闭时终止。linux系统有很多守护进程,大多数服务
都是通过守护进程实现的。
由于在linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进
程都会依附这个终端,这个终端就称为这些进程的控制终端,当控制端被关闭时,相应的进程
都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时
才会退出。
2.编写守护进程
1)创建子进程,父进程退出
由于父进程已经先与子进程退出,会造成子进程没有父进程,从而变成一个孤儿进程。在linux中,
每当系统发现一个孤儿进程,就会自动由1号进程(也就是init进程)收养它,这样原先的子进程
就会变成init进程的子进程。
2)在子进程中创建新会话
.进程组
进程组是一个或多个进程的集合。进程组由进程组ID来唯一识别。除了进程号(PID)之外,进程组
ID也是一个进程的必备属性。
每个进程组都有一个组长进程,起组长进程的进程号等于进程组ID。且该进程ID不会因组长进程
的退出而受到影响。
.会话期
会话组是一个或多个进程组的集合。通常,一个会话开始于用户登陆,终止于用户退出,在此期间
该用户运行的所有进程都属于这个会话期。
3)改变当前目录为根目录
使用fork创建子进程继承了父进程的当前目录。由于在进程运行过程中,当前目录所在的文件系统
是不能卸载的,这对以后的使用会造成很多的麻烦。因此,通常的做法是让"/"作为守护进程的
当前工作目录,这样就可以避免上述的问题,当然,如有特殊需要,也可以把当前工作目录换
成其他的路径,如/tmp.改变工作目录的常见函数是chdir.
4)重设文件权限掩码
文件权限掩码是指屏蔽掉文件权限中的对应位。由于使用fork函数新建的子进程继承了父进程的文
件掩码,这就给该子进程使用文件带来了很多的麻烦。因此,把文件权限掩码设置为0,可以大大
增强该守护进程的灵活性。设置文件权限掩码的函数是umask().
5)关闭文件描述符
同文件权限掩码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开的文件。这些被
打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,而且可能导致所在的文件
系统无法卸下。
3.setsid函数作用
setsid函数用于创建一个新的会话,并担任该会话的组长。调用setsid有下面三个作用:
.让进程摆脱原会话的控制
.让进程摆脱原进程组的控制
.让进程摆脱原控制终端的控制
4.setsid函数格式
1)所需的头文件
#include<sys/types.h>
#include<unistd.h>
2)函数原型
pid_t setsid(void)
3)函数返回值
成功:该进程组ID
出错:-1
5.测试该程序
root@localhost the_seventh_step]# tail -f /tmp/dameon.log
this is a Dameon
this is a dameon
this is a Dameon
this is a Dameon
this is a Dameon
this is a Dameon
this is a Dameon
this is a Dameon
this is a Dameon [root@localhost the_seventh_step]# ps -ef |grep dameon
root 5076 1 0 14:25 ? 00:00:00 ./dameon
root 5121 3812 0 14:26 pts/1 00:00:00 grep dameon ----------------------------------------------*/
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h> #define MAXFILE 65536 int main()
{
pid_t pc;
int i,fd,len;
char *buf="this is a Dameon\n";
len=strlen(buf);//得到buf的长度
pc=fork();//第一步:创建一个子进程
if(pc<0)
{
printf("error fork\n");
exit(1);
}
else if(pc>0)//父进程退出
{
exit(0);
}
setsid();//第二步:调用setsid函数,在子进程中创建新会话
chdir("/");//第三步:改变当前目录为根目录
umask(0);//第四步:重设文件权限掩码
for(i=0;i<MAXFILE;i++)//第五步:关闭文件描述符
{
close(i);
}
while(1)//这时创建完守护进程,以下开始正式进入守护进程工作
{
if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0666))<0)//打开文件
{
perror("open");
exit(1);
}
write(fd,buf,len+1);//想文件中写数据
close(fd);
sleep(10);
}
} /*--------------------------------------------------
1.守护进程概述
守护进程,也就是所说的Daemon进程,是linxu中的后台服务进程。它是一个生存期较长的进
程,通常独立于控制终端并且周期性的地执行某种任务或等待处理某些发生的事件。守护进
程常常是系统引导装入时启动,在系统关闭时终止。linux系统有很多守护进程,大多数服务
都是通过守护进程实现的。
由于在linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进
程都会依附这个终端,这个终端就称为这些进程的控制终端,当控制端被关闭时,相应的进程
都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时
才会退出。
2.编写守护进程
1)创建子进程,父进程退出
由于父进程已经先与子进程退出,会造成子进程没有父进程,从而变成一个孤儿进程。在linux中,
每当系统发现一个孤儿进程,就会自动由1号进程(也就是init进程)收养它,这样原先的子进程
就会变成init进程的子进程。
2)在子进程中创建新会话
.进程组
进程组是一个或多个进程的集合。进程组由进程组ID来唯一识别。除了进程号(PID)之外,进程组
ID也是一个进程的必备属性。
每个进程组都有一个组长进程,起组长进程的进程号等于进程组ID。且该进程ID不会因组长进程
的退出而受到影响。
.会话期
会话组是一个或多个进程组的集合。通常,一个会话开始于用户登陆,终止于用户退出,在此期间
该用户运行的所有进程都属于这个会话期。
3)改变当前目录为根目录
使用fork创建子进程继承了父进程的当前目录。由于在进程运行过程中,当前目录所在的文件系统
是不能卸载的,这对以后的使用会造成很多的麻烦。因此,通常的做法是让"/"作为守护进程的
当前工作目录,这样就可以避免上述的问题,当然,如有特殊需要,也可以把当前工作目录换
成其他的路径,如/tmp.改变工作目录的常见函数是chdir.
4)重设文件权限掩码
文件权限掩码是指屏蔽掉文件权限中的对应位。由于使用fork函数新建的子进程继承了父进程的文
件掩码,这就给该子进程使用文件带来了很多的麻烦。因此,把文件权限掩码设置为0,可以大大
增强该守护进程的灵活性。设置文件权限掩码的函数是umask().
5)关闭文件描述符
同文件权限掩码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开的文件。这些被
打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,而且可能导致所在的文件
系统无法卸下。
3.setsid函数作用
setsid函数用于创建一个新的会话,并担任该会话的组长。调用setsid有下面三个作用:
.让进程摆脱原会话的控制
.让进程摆脱原进程组的控制
.让进程摆脱原控制终端的控制
4.setsid函数格式
1)所需的头文件
#include<sys/types.h>
#include<unistd.h>
2)函数原型
pid_t setsid(void)
3)函数返回值
成功:该进程组ID
出错:-1
5.测试该程序
root@localhost the_seventh_step]# tail -f /tmp/dameon.log
this is a Dameon
this is a dameon
this is a Dameon
this is a Dameon
this is a Dameon
this is a Dameon
this is a Dameon
this is a Dameon
this is a Dameon [root@localhost the_seventh_step]# ps -ef |grep dameon
root 5076 1 0 14:25 ? 00:00:00 ./dameon
root 5121 3812 0 14:26 pts/1 00:00:00 grep dameon ----------------------------------------------*/
相关阅读 更多 +