Linux守护进程小样例
来源:互联网 发布:c 窗口编程 编辑:程序博客网 时间:2024/04/30 15:12
程序目的:设计三个并发的守护进程在后台运行,其中第一子进程写守护进程的运行日志记录,第二子进程child2则监控进程中是否有gedit工具调用,第二子进程child3则检查自己是否有新邮件到达,若有则将邮件内容输出到一个主目录下文件
程序分析:此处我借用fork()函数创建三个并发的守护进程,借用syslog调试程序运行;其中,第二子进程child2作为gedit工具调用的监控守护进程,
第一子进程child1借助syslog日志监控守护进程的运行,第二子进程child3此处用来检查是否有新邮件收到,收到则将邮件内容输出到重定向输出文件标记:
一般来说守护进程无法在终端中调试,也无法在终端输出,故而均采用syslog()函数进行跟踪调试
/*文件名为2.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <syslog.h>
#include <signal.h>
#include <sys/param.h>
#include <time.h>
#include <dirent.h>
int main()
{
pid_t child1,child2,child3;
struct stat buf;
int i,check=0,j=0;
time_t t;
DIR * dir;
struct dirent * ptr;
child1=fork();
if (child1>0)
exit(0); /*父进程退出*/
else if(child1<0)
{
perror("创建子进程失败");
exit(1);
}
/*第一子进程*/
//注意以下几行代码是守护进程与普通进程的区别部分
setsid(); //设置进程为新组组长
chdir("/"); //换到根目录下
umask(0); //取消文件掩码
for(i=0;i<NOFILE;++i)
close(i); //关闭标准输入,标准输出,标准错误处理
openlog("守护进程程序信息",LOG_PID,LOG_DAEMON); /*打开守护进程日志/var/log/syslog */
child2=fork();
if (child2==-1)
{
perror("创建子进程失败");
exit(2);
}
else if (child2==0)/*第二子进程中的child2*/
{
i=0;
while(i++<100){
system("ps -ef|grep gedit> /home/king/gedit.log");
stat("home/king/gedit.log",&buf); /*根据从进程中调出的文件数据大小判读当前是否有调用gedit工具*/
if (buf.st_size>180 && check==0) /*此处的180来自于文件查看得出的数据,check用来记录当前gedit是否调用*/
{
t=time(0);
syslog(LOG_INFO,"gedit开始时间为: %s\n",asctime(localtime(&t)));
check=1;
}
if (buf.st_size<180 && buf.st_size>0 && check==1)
{
t=time(0);
syslog(LOG_INFO,"gedit结束时间为: %s\n",asctime(localtime(&t)));
check=0;
}
sleep(1);
}
}
else
{ /*在第一子进程下继续创建进程*/
child3=fork();
if (child3<0){
perror("创建子程序失败");
exit(3);
}
else if (child3==0){ /*第二子进程child3用来查看邮件*/
j=0;
dir=opendir("/var/spool/mail/king");
while (j<6){
j++;
sleep(10);
if ((ptr=readdir(dir))!=NULL){
system("cat /var/spool/mail/king/* > /home/king/mail.log");
}
}
closedir(dir);
}
else
{ /*第一子进程写日志来记录守护进程的运行*/
t=time(0);
syslog(LOG_INFO,"守护进程开始时间为: %s\n",asctime(localtime(&t)));
waitpid(child2,NULL,0);
waitpid(child3,NULL,0);
t=time(0);
syslog(LOG_INFO,"守护进程结束时间为: %s\n",asctime(localtime(&t)));
closelog();
while (1)
sleep(10);
}
}
}
在下linux系统为ubuntu,主文件名为king
先在 var/spool/mail/king/下建一文本文件,便于测试第二子进程child3功能
在终端1中运行
sudo ./2
tail -f /var/log/syslog
监控程序运行
Sep 5 18:27:54 ubuntu 守护进程程序信息[26748]: 守护进程开始时间为: Sun Sep 5 18:27:54 2010#012
Sep 5 18:28:10 ubuntu 守护进程程序信息[26749]: gedit开始时间为: Sun Sep 5 18:28:10 2010#012
Sep 5 18:28:32 ubuntu 守护进程程序信息[26749]: gedit结束时间为: Sun Sep 5 18:28:32 2010#012
Sep 5 18:29:12 ubuntu 守护进程程序信息[26748]: 守护进程结束时间为: Sun Sep 5 18:29:12 2010#012
在终端2中运行
ps -ef | grep ./2
可观察到相应的守护进程运行
运行一个gedit文件,等待数秒后关闭
再等候一会到对应的守护进程全部停止关闭
最终在主目录下的mail.log中可看到邮件内容
个人想法:守护进程能够在后台提供服务,那么便具有一定的隐蔽性,一般操作用户无法发现.......所以是个用来做黑客软件的很好的程序对象
- Linux守护进程小样例
- linux守护进程小例 与syslog
- LINUX守护进程介绍
- Linux守护进程简介
- linux 守护进程编写
- linux 守护进程 daemon
- Linux实现守护进程
- Linux 守护进程
- linux 守护进程
- LINUX守护进程
- Linux 守护进程
- linux 守护进程 daemon
- linux守护进程介绍
- linux守护进程介绍
- Linux守护进程
- Linux守护进程
- Linux守护进程介绍
- linux之守护进程
- 堆排序算法的java实现
- extjs extjs3 extjs4 htmleditor 引入自定义样式
- SQL Server和XML的集成
- mangos vc2008编译问题
- Linux 进程间通信管道
- Linux守护进程小样例
- SQL Server和XML的集成
- java设计模式-命令模式
- OK6410之开发环境的搭建
- epoll学习笔记
- C++:计算一个整数的数字之和
- 学习笔记——FileReader,FormData
- AWK简单教程
- 今天,很平常的一天,